Java 带MTOM附件的Spring WS-webservice-Hello world测试

Java 带MTOM附件的Spring WS-webservice-Hello world测试,java,spring,soap,jaxb,mime-types,Java,Spring,Soap,Jaxb,Mime Types,我试图创建一个简单的SpringWebService,当调用它时,它将返回一个文件附件作为SOAP响应的一部分。Enpoint类别如下所示: 最后是终点 @PayloadRoot(namespace="http://ws.mypackage.com", localPart="downloadMessageRequest") @ResponsePayload public JAXBElement<DownloadResponseType> invoke(@Request

我试图创建一个简单的SpringWebService,当调用它时,它将返回一个文件附件作为SOAP响应的一部分。Enpoint类别如下所示:

最后是终点

@PayloadRoot(namespace="http://ws.mypackage.com", localPart="downloadMessageRequest")
    @ResponsePayload
    public JAXBElement<DownloadResponseType> invoke(@RequestPayload DownloadMessageRequest req) throws Exception  {

        DownloadResponseType response = new DownloadResponseType();
        DownloadResponseType.PayLoad payload = new DownloadResponseType.PayLoad();          

        javax.activation.DataHandler dataHandler = new javax.activation.DataHandler(new FileDataSource("c:\\temp\\maven-feather.png"));
        payload.setMessagePayLoad(dataHandler);
        response.setPayLoad(payload);

        return objectFactory.createDownloadMessageResponse(response);

    }
@PayloadRoot(命名空间=”http://ws.mypackage.com,localPart=“downloadMessageRequest”)
@回应书
公共JAXbeElement调用(@RequestPayload DownloadMessageRequest req)引发异常{
DownloadResponseType response=新的DownloadResponseType();
DownloadResponseType.PayLoad PayLoad=新的DownloadResponseType.PayLoad();
javax.activation.DataHandler DataHandler=newjavax.activation.DataHandler(newfiledatasource(“c:\\temp\\maven feather.png”);
setMessagePayLoad(dataHandler);
响应。设置有效载荷(有效载荷);
返回objectFactory.createDownloadMessageResponse(响应);
}
我希望响应将该文件作为附件包含,类似于以下响应:

Content-Type: multipart/related; boundary=MIMEBoundary4A7AE55984E7438034;
                         type="application/xop+xml"; start="<0.09BC7F4BE2E4D3EF1B@apache.org>";
                         start-info="text/xml; charset=utf-8"

--MIMEBoundary4A7AE55984E7438034
content-type: application/xop+xml; charset=utf-8; type="application/soap+xml;"
content-transfer-encoding: binary
content-id: <0.09BC7F4BE2E4D3EF1B@apache.org>

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="...."....>
  ........
         <xop:Include href="cid:1.A91D6D2E3D7AC4D580@apache.org" 
                        xmlns:xop="http://www.w3.org/2004/08/xop/include">
         </xop:Include>
  ........

</soapenv:Envelope>
--MIMEBoundary4A7AE55984E7438034
content-type: application/octet-stream
content-transfer-encoding: binary
content-id: <1.A91D6D2E3D7AC4D580@apache.org>

Binary Data.....
--MIMEBoundary4A7AE55984E7438034--
内容类型:多部分/相关;边界=MIME边界4A7AE55984E7438034;
type=“应用程序/xop+xml”;start=“”;
start info=“text/xml;charset=utf-8”
--MIME边界4A7AE55984E7438034
内容类型:应用程序/xop+xml;字符集=utf-8;type=“应用程序/soap+xml;”
内容传输编码:二进制
内容id:
........
........
--MIME边界4A7AE55984E7438034
内容类型:应用程序/八位字节流
内容传输编码:二进制
内容id:
二进制数据。。。。。
--MIME边界4A7AE55984E7438034--
我试图遵循spring ws-samples中的文档和示例代码,由于某种原因,我得到的输出总是这样(即base64数据不是附件)

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
SOAPAction: ""
Content-Type: text/xml;charset=utf-8
Content-Length: 4750
Date: Tue, 03 Jul 2012 17:05:21 GMT

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns2:downloadMessageResponse xmlns:ns2="http://ws.mypackage.com"><ns2:payLoad><ns2:messagePayLoad>....iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCyAAAAAElFTkSuQmCC....</ns2:messagePayLoad></ns2:payLoad></ns2:downloadMessageResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
HTTP/1.1200正常
服务器:ApacheCoote/1.1
接受:text/xml、text/html、image/gif、image/jpeg、*;q=.2、*/*;q=.2
SOAPAction:“
内容类型:text/xml;字符集=utf-8
内容长度:4750
日期:2012年7月3日星期二17:05:21 GMT
…IVBORW0KGGOAAAANSUHEUGAAFOAAAECYAAAELFTKSUQMCC。。。。
如您所见,负载不是附件。以下是我如何配置我的应用程序:

web.xml

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
        /WEB-INF/app-config.xml
        </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>webservice</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/ws-config.xml</param-value>
        </init-param>
    </servlet>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">

    <display-name>MyCompany HR Holiday Service</display-name>

    <servlet>
        <servlet-name>spring-ws</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring-ws</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

上下文配置位置
/WEB-INF/app-config.xml
org.springframework.web.context.ContextLoaderListener
网络服务
org.springframework.ws.transport.http.MessageDispatcherServlet
上下文配置位置
/WEB-INF/ws-config.xml
ws-config.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ws="http://www.springframework.org/schema/web-services"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/web-services 
    http://www.springframework.org/schema/web-services/web-services-2.0.xsd
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.mypackage"/>

    <ws:annotation-driven/>


    <ws:dynamic-wsdl id="serviceDefinition" portTypeName="myService"
                     locationUri="http://localhost:8080/springWsTest/webservice">
        <ws:xsd location="/WEB-INF/schemas/downloadMessageRequest.xsd"/>
    </ws:dynamic-wsdl>

    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="contextPath" value="com.mypackage.ws"/>
        <property name="mtomEnabled" value="true"/>
    </bean> 
</beans>

downloadMessageRequest.xsd架构文件

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:m="http://ws.mypackage.com" 
xmlns:xmime="http://www.w3.org/2005/05/xmlmime" elementFormDefault="qualified"
targetNamespace="http://ws.mypackage.com" 
attributeFormDefault="unqualified"> 

    <xs:element name="downloadMessageRequest">
        <xs:complexType/>
    </xs:element>

    <xs:element name="downloadMessageResponse" type="m:downloadResponseType" />

    <xs:complexType name="downloadResponseType">
            <xs:sequence>
                <xs:element name="requestName" type="xs:string"/>
                <xs:element name="payLoad">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="messagePayLoad" type="xs:base64Binary" xmime:expectedContentTypes="application/octet-stream"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
     </xs:complexType>


     <xs:element name="localDTMRequest">
        <xs:complexType/>
    </xs:element>

    <xs:element name="localDTMResponse">
        <xs:complexType>        
            <xs:sequence>
                <xs:element name="localDTM" type="xs:dateTime"/>
            </xs:sequence>          
        </xs:complexType>
    </xs:element>


</xs:schema>

该文件确实转换为base64binary。JAXB类别生成正确。端点可以工作,但它没有将该文件作为附件包含。它将其作为XML标记的一部分包含,即使我已将mtomEnabled设置为true


我遗漏了什么?

终于让它工作了。配置与我在原始帖子中的配置大致相同。我必须更新配置文件。下面是我的配置文件现在的样子

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://www.springframework.org/schema/web-services"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.mypackage.ws" />

    <ws:annotation-driven />

    <ws:dynamic-wsdl id="serviceDefinition"
        portTypeName="Msm" locationUri="http://localhost:8080/MyWebService/webservice">
        <ws:xsd location="/WEB-INF/schemas/schema.xsd" />
    </ws:dynamic-wsdl>

    <bean id="messageReceiver"
        class="org.springframework.ws.soap.server.SoapMessageDispatcher">
        <property name="endpointAdapters">
            <list>
                <ref bean="defaultMethodEndpointAdapter" />
            </list>
        </property>
    </bean>

    <bean id="defaultMethodEndpointAdapter"
        class="org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter">
        <property name="methodArgumentResolvers">
            <list>
                <!-- Be careful here! You might need to add more processors if you do 
                    more than webservices! -->
                <ref bean="marshallingPayloadMethodProcessor" />
            </list>
        </property>
        <property name="methodReturnValueHandlers">
            <list>
                <ref bean="marshallingPayloadMethodProcessor" />
            </list>
        </property>
    </bean>

    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="contextPath" value="com.mypackage.ws" />
        <property name="mtomEnabled" value="true" />
    </bean>

    <bean id="marshallingPayloadMethodProcessor"
        class="org.springframework.ws.server.endpoint.adapter.method.MarshallingPayloadMethodProcessor">
        <constructor-arg ref="marshaller" />
        <constructor-arg ref="marshaller" />
    </bean>
</beans>

我添加的更改是基于我在本文中读到的内容——blog.hpxn.net/2012/06/

编辑-一个例子 下面是一个以MTOM格式返回附件的示例(基于spring示例)。我刚刚尝试了它,响应如下所示:

   HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
SOAPAction: ""
Content-Type: Multipart/Related; start-info="text/xml"; type="application/xop+xml"; boundary="----=_Part_0_17910623.1342789122256"
Transfer-Encoding: chunked
Date: Fri, 20 Jul 2012 12:58:42 GMT

------=_Part_0_17910623.1342789122256
Content-Type: application/xop+xml; charset=utf-8; type="text/xml"

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns2:LoadImageResponse xmlns:ns2="http://www.springframework.org/spring-ws/samples/mtom"><ns2:name>?</ns2:name><ns2:image><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:f1c3ef65-a519-4bba-9b92-9acffc0c14f7%40www.springframework.org"/></ns2:image></ns2:LoadImageResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
------=_Part_0_17910623.1342789122256
Content-Type: image/png
Content-ID: <f1c3ef65-a519-4bba-9b92-9acffc0c14f7@www.springframework.org>
Content-Transfer-Encoding: binary

‰PNG
HTTP/1.1200正常
服务器:ApacheCoote/1.1
接受:text/xml、text/html、image/gif、image/jpeg、*;q=.2、*/*;q=.2
SOAPAction:“
内容类型:多部分/相关;start info=“text/xml”Type=“application/xop+xml”boundary=“-----=\u Part\u 0\u 17910623.1342789122256”
传输编码:分块
日期:2012年7月20日星期五12:58:42 GMT
------=\u第0部分\u 17910623.1342789122256
内容类型:application/xop+xml;charset=utf-8;Type=“text/xml”
?
------=\u第0部分\u 17910623.1342789122256
内容类型:图像/png
内容ID:
内容传输编码:二进制
‰巴布亚新几内亚
请注意,我没有配置任何Axiom工厂。下面列出了必要的文件:

schema.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.springframework.org/spring-ws/samples/mtom"
        xmlns:tns="http://www.springframework.org/spring-ws/samples/mtom"
        xmlns:xmime="http://www.w3.org/2005/05/xmlmime" elementFormDefault="qualified">

    <element name="StoreImageRequest" type="tns:Image"/>

    <element name="LoadImageRequest" type="string"/>

    <element name="LoadImageResponse" type="tns:Image"/>

    <complexType name="Image">
        <sequence>
            <element name="name" type="string"/>
            <element name="image" type="base64Binary" xmime:expectedContentTypes="image/png"/>
        </sequence>
    </complexType>

</schema>

spring-ws-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="imageRepository" class="org.springframework.ws.samples.mtom.service.StubImageRepository"/>

    <bean class="org.springframework.ws.samples.mtom.ws.ImageRepositoryEndpoint">
        <constructor-arg ref="imageRepository"/>
    </bean>

    <bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"/>

    <bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">
        <constructor-arg ref="marshaller"/>
    </bean>

    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="contextPath" value="org.springframework.ws.samples.mtom.schema"/>
        <property name="mtomEnabled" value="true"/>
    </bean>

    <bean id="mtom" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
        <property name="schema" ref="schema"/>
        <property name="portTypeName" value="ImageRepository"/>
        <property name="locationUri" value="http://localhost:8080/mtom-server/"/>
    </bean>

    <bean id="schema" class="org.springframework.xml.xsd.SimpleXsdSchema">
        <property name="xsd" value="/WEB-INF/schema.xsd"/>
    </bean>

</beans>

web.xml

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
        /WEB-INF/app-config.xml
        </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>webservice</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/ws-config.xml</param-value>
        </init-param>
    </servlet>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">

    <display-name>MyCompany HR Holiday Service</display-name>

    <servlet>
        <servlet-name>spring-ws</servlet-name>
        <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring-ws</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

我公司人力资源假期服务
春季天气预报
org.springframework.ws.transport.http.MessageDispatcherServlet
春季天气预报
/*

要获得作为SAAJ附件而不是MTOM附件返回的响应,我必须按照本线程中的描述手动配置SAAJ工厂

您找到解决方案了吗?我正在努力解决同一个问题。仍然在这个问题上?还没有解决它,但我创建了一个关于它的新问题,并提供了我所需的所有信息我可以收集。我很感谢你的帮助,或者你也可以好好利用它。谢谢。我试过了,它确实可以工作,只是它使用了SAAJ,它不支持MTOM并处理内存中的所有附件数据,导致大附件崩溃。Axiom解决了这些问题,但缺少与Spring的集成(不支持XOP)和附件的内联线