1

我在使用自动装配时遇到了一些问题

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

主.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();

测试应用程序.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 吗?还是因为我尝试自动接线的方式?

4

2 回答 2

1

好的,我开始工作了

好的,所以我修复了它(我会将其发布为答案,但无法回答我自己的问题:/)

把答案放在这里帮助其他有同样问题的人

看了下面的 Autowireing 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 的状态保持不变(尽管这可能是我对 spring 还是新手所以我不确定的可疑行为)

于 2013-04-16T06:01:10.007 回答
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;
    ...
于 2013-04-15T12:01:56.337 回答