【问题标题】:Jersey + Spring standalone webservice @Autowire not workingJersey + Spring独立网络服务@Autowire不工作
【发布时间】:2015-07-03 12:28:45
【问题描述】:

我正在使用 Jersey 将 Restful Web 服务作为独立应用程序运行。

以下是我服务于请求的服务类。

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

下面是我的spring配置文件。

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

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

但我的 defaultMessageemLoginDAO 对象为空。所以不是指属性和spring配置文件。

所以任何人都可以帮助我纠正这个问题。或者想办法将属性和 spring 配置文件路径设置为 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) {
                }
            }
        }

【问题讨论】:

  • 你如何发布你的服务?
  • 我已经用代码更新了任务。请检查。

标签: java spring jersey spring-boot


【解决方案1】:

我认为这是罪魁祸首: 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());

您正在通过 spring 容器创建一个 loginServiceImpl,我敢打赌,如果您检查您的自动装配字段是否会存在。

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

【讨论】:

  • LoginServiceImpl loginServiceImpl = (LoginServiceImpl) springApplicationContext.getBean("loginServiceImpl"); DefaultResourceConfig resourceConfig = new DefaultResourceConfig( loginServiceImpl.getClass());正如您所提到的,我已经更改了代码。但是这种方式服务甚至没有启动。
  • 查看我的评论,您仍然没有在 DefaultResourceConfig 中使用 spring 托管 bean - 您正在使用 spring 托管 bean 来获取类,但是 resourceConfig 将自己实例化一个而不是使用 Spring 的,你需要传入你的 loginServiceImpl 实例,而不是类。
  • 但是在 DefaultResourceConfig 类中没有构造函数可以接受任何服务类的实例。
【解决方案2】:

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

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

它应该为任何后端(非 Jax-rs)依赖项启用 Spring-boot 连接 Grizzly、Jersey 和 Spring。

或者没有 Spring Boot(普通的旧 Jersey 和 Spring)

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

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

【讨论】:

    【解决方案3】:

    你是否在你的 spring 配置文件中配置了这两个? 我的意思是您是否也将 EmLoginDAO 注释为原型组件?

    【讨论】:

      【解决方案4】:

      我得到了这个工作。

      参考了 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);
      

      感谢大家的帮助。

      【讨论】:

        猜你喜欢
        • 2017-04-25
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        相关资源
        最近更新 更多