2016-12-14 6 views
0

Я хотел бы задать вам вопрос о области бобы с помощью cxf. Согласно документации, все бобы будут в области Singleton. Однако я хотел бы иметь их в запросе области.Сфера применения cxf jaxrs

В доке здесь http://cxf.apache.org/docs/jaxrs-services-configuration.html

я нашел:

Когда классы и поставщики регистрируются таким образом, жизненный цикл по умолчанию 'синглтона. Вы можете переопределить его, установив параметр «jaxrs.scope» со значением «prototype» (эквивалентно запросу).

Я попробовал тысячи вещей, и я не мог заставить их работать:

Вот мой веб-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.

Я хотел бы иметь все мои бобы в качестве запроса. Могу ли я найти общий способ его настройки.

На самом деле у меня нет проблем с singleton, так как единственными полями, которые у меня есть, являются сервисы, которые также являются singleton и единственным моментом, когда мне нужно использовать поля, специфичные для запроса, который я делаю в новом MyObject. Однако я слышал, что Singleton может вызвать задержку, если трафик растет на сервере.

У вас есть идеи, что я могу сделать?

Большое спасибо заранее и наилучшими пожеланиями

Джеффри

ответ

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

и вуаля !!!!