【问题标题】:Spring 2.5.5 and jersey with autowired弹簧 2.5.5 和带自动连线的球衣
【发布时间】:2013-07-04 06:57:16
【问题描述】:

我正在尝试将 jersey 集成到现有的 Spring 应用程序(Spring 2.5.5)中。 Jersey 工作正常,但是当我 AutoWire 现有的 spring bean 时,该对象为空。 下面是我的 web.xml

<servlet>
    <servlet-name>fs3web</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
    <servlet-name>jersey-servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.fl.fs3.api;org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    <init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
         <param-value>true</param-value>
</init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>fs3web</servlet-name>
    <url-pattern>/fs3/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>jersey-servlet</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

而且,这里是我的应用程序上下文 xml(显然这不完整,因为这是一个巨大的应用程序,还有更多的 bean 定义): TestPojo 是我的 bean,我想自动装配到我的球衣资源。

<context:annotation-config />  
<aop:aspectj-autoproxy/> 
<context:component-scan base-package="com.fl.fs3.api,com.fl.fs3.integration.*.web"/>    

我的球衣资源类和 POJO 类都在包 com.fl.fs3.api

@Component
@Path("/v1/site")
public class SitesApiControllerV1 {
    @Autowired TestPojo  testPojo;

    @GET
    @Path("/{folderName}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getSite(@PathParam("folderName") String folderName) {
         System.out.println("pojo obj:" + testPojo);
         return Response.ok("info for " + folderName).build();
}
}

@Component
public class TestPojo {

}

当我启动我的 tomcat 时,我没有在日志中看到预期的行: INFO: Registering Spring bean, hello, of type ..... as a root resource class 当我调用我的服务/v1/site/xyz 时,testPojo 对象为空。

但是,在将其集成到我现有的项目之前,我做了一个示例 jersey+spring 应用程序,它运行良好。我能够在日志中看到“Registering Spring bean”行。

感谢任何帮助。

【问题讨论】:

  • 尽管 Spring 3.2.2 几个月前发布(甚至更新版本即将发布或可能已经发布),但您是否真的有兴趣使用这个相当旧的 Spring 版本 (2.5.5)发布)?在您继续进行的过程中,您将来可能会面临严重的问题。
  • Spring 上下文在哪里以及如何初始化?我在web.xml 中没有看到对它的引用。
  • @Lion 我们尝试升级到 spring 3.2,但我们遇到了一些问题。由于这是一个关键应用程序,我们目前不倾向于升级到 spring 3.2.2。所以,现在需要使用 2.5.5。
  • @Tichodroma 该应用程序称为 fs3web,因此 fs3web-servlet.xml 是加载的应用程序上下文。 Spring 应用程序本身运行良好。

标签: spring jersey autowired


【解决方案1】:

试试这个,可能会更简单:

通过web.xml 加载弹簧,如下图所示为正常弹簧配置:

<servlet>
    <servlet-name>project-spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:project-spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>project-spring</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

现在通过应用程序加载你的球衣资源,如下所示:

@ApplicationPath("/rest")
public class ResourceLoader extends Application
{

    /* (non-Javadoc)
     * @see javax.ws.rs.core.Application#getClasses()
     */
    @Override
    public Set<Class<?>> getClasses()
    {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        loadResourceClasses(classes);
        return classes;
    }

    private void loadResourceClasses(Set<Class<?>> classes)
    {
        classes.add(StudentResource.class);
    }
}

然后在你的资源中:

@Path("student")
class StudentResource
{
    private StudentService studentService;

    StudentResource(@Context ServletContext servletContext)
    {
        ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        this.transactionService = applicationContext.getBean(StudentService .class);
    }
}

给你。 Spring 已经用 Jersey 配置了所有依赖注入!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2016-04-03
    • 2021-06-02
    • 2018-01-04
    相关资源
    最近更新 更多