我使用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) {
}
}
}
答案 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);
谢谢大家的帮助。