2017-04-14 5 views
0

Apache CXFの依存性cxf-rt-transports-http-jetty-3.1.4.jarを使用してJAXRSサービスをテストします。以下は、JUnitはannotations-さスレッドなしの要求が見つかりました

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(locations = {"classpath:test-spring-context.xml"}) 

web.xmlの(web.xmlファイルは@WebAppConfigurationによってロードされますが、それは標準のディレクトリSRCに/メイン/ webappの/ WEB-INF/web.xmlのだとは思わない)

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<!-- listener to inject HttpServlet Request --> 
<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

<!-- CXF Servlet --> 
<servlet> 
    <servlet-name>CXFServlet</servlet-name> 
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>CXFServlet</servlet-name> 
    <url-pattern>/service/*</url-pattern> 
</servlet-mapping> 

桟橋構成 -

<httpj:engine-factory bus="cxf" id="port9191"> 
    <httpj:engine port="9191"> 
     <httpj:threadingParameters minThreads="5" 
      maxThreads="15" /> 
     <httpj:handlers> 
      <bean class="org.eclipse.jetty.server.handler.DefaultHandler" /> 
     </httpj:handlers> 
     <httpj:sessionSupport>true</httpj:sessionSupport> 
    </httpj:engine> 
</httpj:engine-factory> 

彼を読み取ろうとしたときに例外を下回る取得@Autowired HttpServletRequest requestオブジェクトrequest.getHeader("ApplicationName");からADER -

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. 
at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.web.context.support.WebApplicationContextUtils.currentRequestAttributes(WebApplicationContextUtils.java:309) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.web.context.support.WebApplicationContextUtils.access$400(WebApplicationContextUtils.java:64) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.web.context.support.WebApplicationContextUtils$RequestObjectFactory.getObject(WebApplicationContextUtils.java:325) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.web.context.support.WebApplicationContextUtils$RequestObjectFactory.getObject(WebApplicationContextUtils.java:320) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
at org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler.invoke(AutowireUtils.java:307) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 

は、任意の助けもいただければ幸いです!

+0

_src/main/webapp/web.xml_は標準の場所ではありません。 _src/main/webapp/WEB-INF/web.xml_に入れてください。 RequestContextListenerをリスナーとして宣言したことに気付かない理由があります。 –

+0

間違って私はポストに間違ったパスを入れていた。 src/main/webapp/WEB-INFの中にのみあります。私は今質問を更新しました。 –

答えて

0

JAX-RS ContainerRequestFilterを介してHttpServletRequestを注入します。

import java.io.IOException; 

import javax.servlet.http.HttpServletRequest; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.ext.Provider; 

import org.springframework.context.i18n.LocaleContextHolder; 
import org.springframework.web.context.request.RequestContextHolder; 
import org.springframework.web.context.request.RequestContextListener; 
import org.springframework.web.context.request.ServletRequestAttributes; 

@Provider 
public class RequestFilter implements ContainerRequestFilter { 
    private static final String REQUEST_ATTRIBUTES_ATTRIBUTE = 
      RequestFilter.class.getName() + ".REQUEST_ATTRIBUTES"; 

    @Context private HttpServletRequest httpRequest; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     ServletRequestAttributes attributes = new ServletRequestAttributes(httpRequest); 
     httpRequest.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes); 
     LocaleContextHolder.setLocale(httpRequest.getLocale()); 
     RequestContextHolder.setRequestAttributes(attributes); 
    } 

} 
関連する問題