使用 Spring 配置 Rest(泽西岛)

Configuring Rest (Jersey) with Spring

我正在尝试将 Jersey 1.8 与 Spring 4 一起使用。但是我无法使用 Spring.

在 Rest Class 中注入依赖项

每次我尝试调用自动装配的依赖项时,我都会得到 NULL。谁能建议为什么我的依赖项没有被注入?

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>



    <servlet>
        <servlet-name>Rest</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>org.portal.services</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Rest</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>  

spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <context:component-scan base-package="org.portal.services"></context:component-scan>
    <context:annotation-config />

    <bean
        class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location">
            <value>WEB-INF/dataSource.properties</value>
        </property>
    </bean>
    <import resource="hibernate.cfg.xml" />
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <bean id="addCountryService" class="org.portal.services.AddCountryService">
        <property name="addCountryProcessor" ref="addCountryProcessor"></property>
    </bean>

    <bean id="addCountryProcessor" class="org.portal.processors.AddCountryProcessor">
        <property name="hibernateTemplate" ref="hibernateTemplate" />
    </bean>


</beans>

休息控制器

package org.portal.services;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.portal.dto.Country;
import org.portal.processors.AddCountryProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

@Component
@Path("/Country")
public class AddCountryService {

    @Autowired
    private AddCountryProcessor addCountryProcessor;

    @POST
    @Path("/addCountry")
    @Produces(MediaType.APPLICATION_XML)
    @Consumes(MediaType.APPLICATION_XML)
    public String addCountry(String newCountry) {

        XStream xStream = new XStream(new DomDriver());
        xStream.alias("country", Country.class);
        xStream.alias("id", String.class);
        xStream.alias("name", String.class);
        xStream.alias("region", Integer.class);

        Country country  = (Country)xStream.fromXML(newCountry);
        System.out.println("processor is "+addCountryProcessor);

        if(country != null){
            addCountryProcessor.addCountry(country);
        }
        return newCountry;
    }

    public void setAddCountryProcessor(AddCountryProcessor addCountryProcessor) {
        this.addCountryProcessor = addCountryProcessor;
    }

    public AddCountryProcessor getAddCountryProcessor() {
        return addCountryProcessor;
    }

}

向“http://localhost:7070/HumanResourcePortal/rest/Country/addCountry”发送请求后,流程进入 "addCountry()" 方法,但随后将 addCountryProcessor 打印为 null

这里有两个选项:

  • @Autowired 替换为 @com.sun.jersey.spi.inject.Inject。此 @Inject 注释将从配置的 DI 框架注入。

  • 使用 com.sun.jersey.spi.spring.container.servlet.SpringServlet 通过 spring 集成部署您的资源。对于 spring 集成,您需要包含以下依赖项:

    <dependency>
      <groupId>com.sun.jersey.contribs</groupId>
      <artifactId>jersey-spring</artifactId>
      <version>1.8</version>
      <exclusions>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    

Spring 依赖项在此处被排除,以使用您声明的依赖项而不是 jersey-spring.

使用的依赖项