泽西HK2依赖性错误

时间:2017-08-09 09:11:14

标签: java dependency-injection jersey jetty hk2

我正在使用Jersey创建RESTful Web服务。我也使用Jetty嵌入式Web服务器,它运行Java main方法。泽西岛默认为HK2 DI。我遇到了服务的依赖注入问题:

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)

我已经看过几个教程并且已经在Stackoverflow中回答了问题,但似乎我的工作仍然存在依赖注入的问题。

我有以下代码:

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;
    }
}

谢谢。

1 个答案:

答案 0 :(得分:2)

您无法将ApplicationBinder注册为。它需要注册为实例

register(new ApplicationBinder());