2016-05-09 49 views
0

我正在通过WSDL使用Web服务。我使用Apache CXF wsdl2java生成Java类。服务器端从HTTP/1.0升级到HTTP/1.1,SOAP消息> 4kb抛出'400:错误请求'错误

对于我的soap消息> 4kb,我得到下面的错误。消息< 4kb没有问题得到任何回应。我尝试禁用CHUNKING如下:

soapMessageContext.put(HTTPConstants.CHUNKED, Boolean.FALSE); 

我尝试添加的内容长度的HTTP标头明确,以便它禁用如果这样分块。

Map<String, List<String>> httpHeaders = new HashMap<String,List<String>>(); 
      httpHeaders.put("Content-Length", Collections.singletonList(filelength)); 
      Map<String, Object> reqContext = ((BindingProvider) port).getRequestContext(); 
      reqContext.put(MessageContext.HTTP_REQUEST_HEADERS, httpHeaders); 
      repairOrderResponse = port.submitRepairOrder(security, 
        repairorders); 

请帮我解决这个问题。我无法弄清楚为什么。

堆栈跟踪:

javax.xml.ws.WebServiceException: Could not send Message. 
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:146) 
    at com.sun.proxy.$Proxy80.submitRepairOrder(Unknown Source) 
    at com.ssss.ssjdecommonws.webservices.SSJDECommonService.submitOrder(SSJDECommonService.java:640) 
    at com.ssss.ssjdecommonws.webservices.SSJDECommonService.getRepairOrderResult(SSJDECommonService.java:529) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:167) 
    at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:269) 
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:227) 
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:216) 
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:542) 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:524) 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:126) 
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) 
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:559) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) 
    at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:353) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:911) 
    at org.apache.tomcat.util.net.NioEndpoint$ChannelProcessor.run(NioEndpoint.java:920) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    Caused by: org.apache.cxf.transport.http.HTTPException: HTTP response '400: Bad Request' when communicating with <MY_ENDPOINT_COMES_HERE> 
     at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1549) 
     at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1504) 
     at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1310) 
     at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
     at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:628) 
     at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 
     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) 
     at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565) 
     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474) 
     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377) 
     at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330) 
     at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) 
     at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135) 
     ... 34 more 

这是我如何调用该服务submitOrder()

SubmitRepairOrderService sService = new SubmitRepairOrderService(u, SERVICE_NAME); 
    SubmitRepairOrderType port = sService.getSubmitRepairOrderPort(); 
    List<Handler> new_handlerChain = new ArrayList<Handler>(); 
    fdda = new MessageHandler(props); 
    new_handlerChain.add(fdda); 
    ((BindingProvider) port).getBinding().setHandlerChain(new_handlerChain); 
    security = null; 
    repairOrderResponse = port.submitRepairOrder(security,repairorders); 

我的处理方法如下:

public boolean handleMessage(SOAPMessageContext messageContext) { 
try { 
    SOAPHeader header = null; 
    boolean outMessageIndicator = (Boolean) messageContext 
        .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
    if (outMessageIndicator) { 
    SOAPEnvelope envelope = messageContext.getMessage().getSOAPPart().getEnvelope(); 

    if (envelope.getHeader() != null) { 
        header = envelope.getHeader(); 
    } 
    SOAPElement security = header.addChildElement("Security","oas","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); 
    SOAPElement usernameToken = security.addChildElement("UsernameToken", "oas"); 
    usernameToken.addAttribute(new QName("xmlns:wsu"), 
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); 

SOAPElement username = usernameToken.addChildElement("Username", "oas"); 
       username.addTextNode(userId); 
SOAPElement password = usernameToken.addChildElement("Password", "oas"); 
       password.setAttribute("Type", 
         "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
       password.addTextNode(passcode); 
} 

     } catch (Exception ex) { 
      throw new WebServiceException(ex); 
     } 
     return true; 
    } 

可否请你让我知道你想要更好地理解它的其他代码是什么?

+0

欢迎SO堆栈溢出的用户。你能否把你的代码添加到这个帖子?你对社区有一个特定的问题,这很好,但是如果没有你的代码,我们无法帮助你很容易地解释发生了什么。 –

+0

谢谢@Semicolons和管道磁带我编辑了这个问题.. –

回答

0

您可以使用下面的代码禁用JBoss上的分块。 在创建端口对象后立即添加此代码。

SubmitRepairOrderType port = sService.getSubmitRepairOrderPort(); 

HTTPClientPolicy hTTPClientPolicy = new HTTPClientPolicy(); 
hTTPClientPolicy.setAllowChunking(false); 
    
Client client =  org.apache.cxf.jaxws.JaxWsClientProxy.getClient(port); 
HTTPConduit http = (HTTPConduit) client.getConduit(); 
  
http.setClient(hTTPClientPolicy); 

您可能需要以下jar文件在类路径:

needed jar files

+0

非常感谢。它的工作非常好! –

相关问题