使用Spring配置Rest(Jersey)

时间:2017-10-10 18:56:30

标签: spring rest jersey jersey-1.0

我试图在Spring 4中使用Jersey 1.8。但我无法使用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>  

弹簧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>

Rest Coltroller

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”发布请求后,Flow将进入“addCountry()”方法,但随后它将addCountryProcessor打印为null

1 个答案:

答案 0 :(得分:0)

这里有两个选项:

  • @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使用的依赖项。