2016-05-09 12 views
0

WSDLを通じてWebサービスを使用しています。 Apache CXF wsdl2javaを使用してJavaクラスを生成しました。サーバー側でHTTP/1.0からHTTP/1.1にアップグレードすると、SOAPメッセージ> 4kbで '400:Bad Request'エラーが発生する

私の石鹸のメッセージが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

ありがとう@セミコロンとダクトテープ私は質問を編集しました.. –

答えて

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

ありがとうございました。それは完璧にうまくいった! –

関連する問題