2017-08-09 104 views
1

我使用Jersey創建了RESTful Web服務。我還使用通過Java主要方法運行的Jetty嵌入式Web服務器。有了澤西島,默認HK2 DI。我得到的問題與依賴注入的服務:Jersey HK2依賴錯誤

Aug 09, 2017 4:16:30 PM org.glassfish.jersey.internal.Errors logErrors 
WARNING: The following warnings have been detected: WARNING: Unknown HK2 failure detected: 
MultiException stack 1 of 3 
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=HelloService,parent=HelloResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,18651401) 

我見過幾個教程和已經在這裏#1回答問題,但似乎我的工作仍對依賴注入的問題。

我有以下代碼:

package hello.config; 
...  
public class ApplicationResourceConfig extends ResourceConfig { 
    public ApplicationResourceConfig() { 
      packages("hello.resource"); 
      register(ApplicationBinder.class); 
      register(JacksonFeature.class); 
     } 
} 

package hello.config; 
... 
public class ApplicationBinder extends AbstractBinder { 
    @Override 
     protected void configure() { 
     bind(HelloServiceImpl.class).to(HelloService.class).in(RequestScoped.class); 
      bind(HelloDaoImpl.class).to(HelloDao.class).in(RequestScoped.class); 
    } 
} 

package hello.resource; 
... 
@Path("/hello") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public class HelloResource { 
     @Inject 
     private HelloService helloService; 

     @GET 
     @Path("world") 
     public String world() { 
      return helloService.hello(); 
    } 
} 

package hello.service; 
... 
@Contract 
public interface HelloService { 
    void hello(); 
} 

package hello.service; 
... 
@Service 
@Named 
public class HelloServiceImpl implements HelloService { 
    @Inject 
    private HelloDao helloDao; 

    @Override 
    public String hello(hello) { 
     helloDao.hello(); 
    } 
} 

package hello.dao; 
... 
@Contract 
public interface HelloDao { 
    String hello(); 
} 

package hello.dao; 
... 
@Named 
public interface HelloDaoImpl { 
    public String hello() { 
     return "Hello, world!"; 
    } 
} 

package hello; 
... 
public class Server { 
    private static final int DEFAULT_PORT = 8080; 
    private static final String DEFAULT_CONTEXT_PATH = "/myapp"; 
    private static final String DEFAULT_MAPPING_URL = "/*"; 

    public static void main(String[] args) { 
     Server server = new Server(port(args)); 
     ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     servletContextHandler.setContextPath(DEFAULT_CONTEXT_PATH); 
     servletContextHandler.addServlet(new ServletContainer(new ApplicationResourceConfig()), DEFAULT_MAPPING_URL); 
     server.setHandler(servletContextHandler); 
     server.start(); 
     LOGGER.info("Server started at port {}", port); 
     server.join(); 
    } 

    public static int port(String[] args) { 
     if (args.length > 0) { 
     String port = args[0]; 
     try { 
      return Integer.valueOf(port); 
     } catch (NumberFormatException exception) { 
      LOGGER.error("Invalid port number {}", port); 
     } 

     return DEFAULT_PORT; 
    } 
} 

謝謝。

回答

2

您不能將ApplicationBinder註冊爲。它需要註冊爲實例

register(new ApplicationBinder()); 
+0

它像一個魅力。謝謝。 –