Jersey + Spring独立webservice @Autowire无法正常工作

时间:2015-07-03 12:28:46

标签: java spring jersey spring-boot

我使用Jersey运行Restful web-service作为独立应用程序。

以下是提供请求的服务类。

LoginServiceImpl.java

@Component
public class LoginServiceImpl implements LoginService {

@Value("${login.service.defaultmessage}")
private String defaultMessage;

@Autowired
private EmLoginDAO emLoginDAO;

@Override
public String defaultCall() {
    return defaultMessage;
}

@Override
public String updatePassword(List<Login> userList) {
    System.out.println(emLoginDAO + "\n" + userList);
    emLoginDAO.save(userList);
    return "Passwords Updated...";
}

@Override
public List<Login> getPasswords() {
    System.out.println("OBJECT: " + emLoginDAO);
    List<Login> userList = null;
    userList = emLoginDAO.findAll();
    return userList;
}
}

LoginService.java

@Component
@Path("/user")
public interface LoginService {

@GET
public String defaultCall();

@POST
@Path(value = "/print")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.TEXT_PLAIN)
public String updatePassword(List<Login> userList);

@GET
@Path(value = "/getpassword")
@Produces(MediaType.APPLICATION_XML)
public List<Login> getPasswords();
}

下面是我的弹簧配置文件。

<context:component-scan base-package="com.em.login" />
<context:annotation-config />

当我调用相应的方法时启动服务后,调用。

但我的 defaultMessage emLoginDAO 对象为空。所以它不是指属性和弹簧配置文件。

任何人都可以帮我解决这个问题。或者找到一种方法来设置Jersey的属性和弹簧配置文件路径。

更新

Closeable server = null;
        try {
            DefaultResourceConfig resourceConfig = new DefaultResourceConfig(
                    LoginServiceImpl.class);
            resourceConfig.getContainerResponseFilters().add(
                    new GZIPContentEncodingFilter());
            server = SimpleServerFactory.create(serviceurl,
                    resourceConfig);


            System.in.read();
        } catch (IOException e) {
        } finally {
            if (server != null) {
                try {
                    server.close();
                } catch (IOException ex) {
                }
            }
        }

4 个答案:

答案 0 :(得分:2)

我认为这是罪魁祸首: DefaultResourceConfig resourceConfig = new DefaultResourceConfig(LoginServiceImpl.class);

您正在使用Spring的IOC来创建对象并进行自动装配,但您没有从Spring容器中获取实例。你需要从Spring容器中获取LoginServiceImpl实例,而不是让Jersey创建它(Jersey不知道如何自动装配你的@Autowired属性。

您应该使用Spring integration with Jersey, seen here.

编辑以回复您的评论,您发布了以下代码:

LoginServiceImpl loginServiceImpl = (LoginServiceImpl) SpringApplicationContext.getBean("loginServiceImpl"); 
DefaultResourceConfig resourceConfig = new DefaultResourceConfig( loginServiceImpl.getClass());

您正在通过弹簧容器创建一个loginServiceImpl,如果您检查自动装配字段,我会打赌。

但是,你使用loginServiceImpl.getClass()的第二行将创建一个 new LoginServiceImpl,它与你从上下文中获得的loginServiceImpl不同,所以你仍然会有同样的问题。

答案 1 :(得分:2)

您可以查看Microserver,它将为您执行Jersey和Spring之间的所有连线(并设置Grizzly网络服务器)。从标签中我注意到你正在使用Spring启动,使用Microserver:micro-boot module你可以做(​​在com.em.login包中的一个类中):

   public static void main(String[] args){
     new MicrobootApp(()->"test-app").run();
   }

它应该连接Grizzly,Jersey&amp;带有Spring-boot的Spring为任何后端(非Jax-rs)依赖项启用。

或者没有Spring Boot(普通老泽西和春天)

  public static void main(String[] args){
     new MicroserverApp(()->"test-app").run();
   }

要手动完成,您需要将Jersey-Spring集成jar添加到类路径中,并确保两者都以互操作的方式配置(即我认为注册Spring ContextListener是必不可少的)。有example app here

答案 2 :(得分:1)

您是否在弹簧配置文件中配置了这两个? 我的意思是你还注释了EmLoginDAO作为构造型组件吗?

答案 3 :(得分:1)

我得到了这个工作。

提到了Jersey文档的this部分。

以下是我用来实现此功能的代码。

ResourceConfig resourceConfig = new ResourceConfig(LoginServiceImpl.class);
resourceConfig.register(org.glassfish.jersey.server.filter.UriConnegFilter.class);
resourceConfig.register(org.glassfish.jersey.server.spring.SpringComponentProvider.class);
resourceConfig.property(ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE, true);
resourceConfig.property("contextConfigLocation", "classpath:/spring-config.xml");

URI serviceUri = UriBuilder.fromUri(serviceHost).port(servicePort).build();
server = SimpleContainerFactory.create(serviceUri, resourceConfig);

谢谢大家的帮助。