2017-04-14 120 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 /主/ web应用/ 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"); -

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 /主/ web应用/ web.xml_不是标准位置。把它放在_src/main/webapp/WEB-INF/web.xml_中。也许这就是它没有注意到你声明了RequestContextListener作为一个监听器的原因。 –

+0

错误地发布了错误的路径。它仅在src/main/webapp/WEB-INF中。我现在已经更新了这个问题。 –

回答

0

HttpServletRequest通过JAX-RS ContainerRequestFilter注入。

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); 
    } 

}