范围请求cxf jaxrs

时间:2016-12-14 13:10:48

标签: scope jax-rs cxf

我想问一个关于使用cxf查找bean的问题。 根据文档,所有bean都将在范围单例中。但是我希望将它们放在范围请求中。

在此处的文档中http://cxf.apache.org/docs/jaxrs-services-configuration.html

我找到了:

  

当以这种方式注册服务类和提供者时,默认生命周期是单身'。您可以通过设置" jaxrs.scope"来覆盖它。参数值为'原型' (相当于每个请求)。

我尝试了数千种东西而且我无法让它们正常工作:

这是我的web xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd" version="3.0">
    <display-name>CxfRestService</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/beans.xml</param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/resource/log4j.properties</param-value>
    </context-param>
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <init-param>
            <param-name>jaxrs.scope</param-name>
            <param-value>request</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
</web-app>

我做了一个简单的测试:

@Path("/")
@WebService(name = "profile", targetNamespace = "")
@Named
public class ProfileCXFService {

    private String thisIsAValue;
    /**
     * Create a profile
     */
    @POST
    @Path("")
    @Produces({ MediaType.APPLICATION_JSON })
    @Consumes({ MediaType.APPLICATION_JSON })
    public Response createProfile(Profile profile){

        if(thisIsAValue == null){
            thisIsAValue = "toto";
        } else{
            return Response.serverError().entity("NOOOOOO").build();
        }
        return Response.ok().entity("YESSSSS").build();
    }

第一个电话是YESSS,第二个电话是NOOOOO。

我想要我的所有豆子作为要求。我可以找到配置它的常用方法吗?

事实上我对单例没有问题,因为我所拥有的唯一字段是单独的服务以及我需要使用特定于请求的字段的唯一时刻我正在做一个新的MyObject。但是我听说如果服务器上的流量增长,Singleton会导致延迟。

你知道我能做些什么吗?

非常感谢并提出最好的问候

杰弗里

1 个答案:

答案 0 :(得分:-1)

所以基本上找到了解决方案:

在beans.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"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/jaxrs
    http://cxf.apache.org/schemas/jaxrs.xsd
    http://cxf.apache.org/jaxws
    http://cxf.apache.org/schemas/jaxws.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.1.xsd
    http://www.springframework.org/schema/aop     
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <jaxrs:server id="profile" address="/profile">
        <jaxrs:providers>
            <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
        </jaxrs:providers>
        <jaxrs:serviceBeans>
            <ref bean="ProfileCXFServiceImpl"/>
        </jaxrs:serviceBeans>
        <jaxrs:extensionMappings>
            <entry key="xml" value="application/xml" />
            <entry key="json" value="application/json" />
        </jaxrs:extensionMappings>
    </jaxrs:server>

    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

    <bean id="ProfileCXFServiceImpl" class="com.project.cxfrestservice.ProfileCXFServiceImpl" scope="prototype"><aop:scoped-proxy /></bean>

</beans>

和Voila !!!!