我在自动装配方面遇到了一些问题
首先我创建一个嵌入式服务器
Main.java
Server server = new Server(8080);
CXFNonSpringServlet cxf = new CXFNonSpringJaxrsServlet();
ServletHolder servlet = new ServletHolder(cxf);
servlet.setInitParameter("javax.ws.rs.Application", "com.asd.dispatcher.rest.testApplication");
servlet.setName("services");
servlet.setForcedPath("services");
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/hello");
server.setHandler(context);
context.addServlet(servlet, "/*");
server.start();
testApplication.java
public class testApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(testServlet.class);
return classes;
}
}
testServlet.java
@Path("/people")
@Component
@Scope("prototype")
public class testServlet {
@Autowired
private StatsService statsService;
@Produces({ "application/json" })
@GET
public String getPeople(@QueryParam("page") @DefaultValue("1") final int page) {
System.out.println("======= getPeople");
//statsService.printStats();
return "Hello World";
}
}
现在我的问题是我的statsService没有在testServlet.java中自动装配,但我可以将它自动装入另一个用@Service注释的类中,
这是因为我使用CXFNonSpringServlet ?? 或者是因为我试图自动装配的方式?
答案 0 :(得分:1)
好的我工作了
好的,所以我修好了(我会发布这个作为答案,但不能回答我自己的问题:/)
将答案放在这里以帮助其他有同样问题的人
看了下面的内容 Autowiring in servlet
我得出的结论是,获取applicationContext然后bean的Post Construct方法可以正常工作
例如:我的代码就是这个
@Path("/people")
@Component
@Scope("prototype")
public class testServlet {
private StatsService statsService;
@PostConstruct
public void initStats() {
System.out.println("============================= Init");
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
statsService = context.getBean("statsService", StatsService.class);
}
@Produces({ "application/json" })
@GET
public String getPeople(@QueryParam("page") @DefaultValue("1") final int page) {
System.out.println("======= getPeople");
statsService.printStats();
return "Hello World";
}
}
虽然这不是自动装配它确实有效,如果有人知道如何使用自动装配这样做我很想知道,因为它会比我找到的解决方案更清洁。
*在旁注上我为我的问题找到了一个新的问题“解决方案”,因为statsService我也有自动装配的其他bean,看起来虽然自动布线初始化这些bean对它们的任何更改另一个类中的状态没有反映在statsService中,事实上这些bean的状态保持不变(尽管这可能是我怀疑的行为,我仍然是新手,所以我不确定)
答案 1 :(得分:0)
我不知道CXFNonSpringServelt是什么,但我的问题是:您是否在应用程序的context-config.xml文件中添加了以上行?
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
...
...
<context:component-scan base-package="package of the classes with annotations" />
在您的服务器类中,您应该添加注释@Service
@Service("myService")
public class MyService ...
您可以像这样使用@Authowire
:
public class Client{
@Autowire
MyService myservice;
...