2015-04-21 3 views
1

Мне тяжело работать с каркасом для трикотажа.Как я могу ввести пользовательский завод, используя hk2?

У меня есть ресурс root.

@Path("sample") 
public class SampleResource { 

    @GET 
    @Path("path") 
    @Produces({MediaType.TEXT_PLAIN}) 
    public String readPath() { 
     return String.valueOf(path); 
    } 

    @Inject 
    private java.nio.file.Path path; 
} 

Я подготовил завод, предоставив path.

public class SamplePathFactory implements Factory<Path> { 

    @Override 
    public Path provide() { 
     try { 
      return Files.createTempDirectory(null); 
     } catch (final IOException ioe) { 
      throw new RuntimeException(ioe); 
     } 
    } 

    @Override 
    public void dispose(final Path instance) { 
     try { 
      Files.delete(instance); 
     } catch (final IOException ioe) { 
      throw new RuntimeException(ioe); 
     } 
    } 
} 

И связующее.

public class SamplePathBinder extends AbstractBinder { 

    @Override 
    protected void configure() { 
     bindFactory(SamplePathFactory.class).to(Path.class); 
    } 
} 

И, наконец, мой испытательный класс.

public class SampleResourceTest extends ContainerPerClassTest { 

    @Override 
    protected Application configure() { 
     final ResourceConfig resourceConfig 
      = new ResourceConfig(SampleResource.class); 
     resourceConfig.register(SamplePathBinder.class); 
     return resourceConfig; 
    } 
} 

Когда я попытался проверить, я получил.

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=Path,parent=SampleResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1916953383) 

Что я сделал не так?

ответ

1

Ваш AbstractBinder s должен быть зарегистрирован как пример , а не как класс. Так что изменение

resourceConfig.register(new SamplePathBinder()); 

и он должен работать

+0

Можете ли вы, пожалуйста, посмотрите на http://stackoverflow.com/q/29767581/330457? –