サンプルの Spring-WS WebService を Tomcat にデプロイしました。Java クライアントでは正常に呼び出すことができますが、Yaws クライアントを使用しようとすると、次のようになります。
Wsdl = yaws_soap_lib:initModel("http://localhost:8080/EncryptionService/holiday.wsdl").
yaws_soap_lib:call(Wsdl, "Holiday", [], [{'p:HolidayRequest', [], "aaa"}]).
サーバー側の例外が発生します:
org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [spring-ws] in context with path [/EncryptionService] threw exception [Request processing failed; nested exception is org.springframework.ws.soap.SoapMessageCreationException: Could not create message from InputStream: Invalid Content-Type:application/xml. Is this an error message instead of a SOAP response?; nested exception is com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Invalid Content-Type:application/xml. Is this an error message instead of a SOAP response?] with root cause
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Invalid Content-Type:application/xml. Is this an error message instead of a SOAP response?
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.identifyContentType(MessageImpl.java:602)
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.<init>(MessageImpl.java:275)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl.<init>(Message1_1Impl.java:67)
at
(...)
Java と Yaws の HTTP リクエストを比較すると、最初のリクエストは「Content-Type: text/xml; charset=utf-8」で、2 番目のリクエストは「Content-Type: application/xml; charset=utf-8」です。ただし、yaws_soap_lib.erl ソース ファイルでは、コンテンツ タイプがハードコードされているようです。
make_request_body(Content, []) ->
{"application/xml; charset=utf-8",
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"++ Content};
make_request_body(Content, AttachedFiles) ->
{"application/dime",
yaws_dime:encode("<?xml version=\"1.0\" encoding=\"utf-8\"?>" ++ Content,
AttachedFiles)}.
これを「text/xml」に変更して再コンパイルすると、Yaws クライアントは正常に動作します。
ソースコードを変更せずにクライアントを動作させる方法はありますか?
WSDL とリクエスト/レスポンス コンテンツを添付できますが、ここでは必要ないと思います。