Servlet中的Spring自动装配问题

时间:2013-04-15 11:52:32

标签: spring autowired embedded-jetty

我在自动装配方面遇到了一些问题

首先我创建一个嵌入式服务器

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 ?? 或者是因为我试图自动装配的方式?

2 个答案:

答案 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;
    ...