Spring-WS webservice avec MTOM pièce jointe - Bonjour tout le monde test
Je suis en train de créer un simple Ressort webservice qui, lorsqu'il est appelé renvoie un fichier en pièce jointe comme partie de la réponse SOAP. Le Enpoint catégorie est indiqué ci-dessous:
Et enfin le point de terminaison
@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);
}
Je voudrais la réponse à inclure le fichier en pièce-jointe similaire à la réponse suivante:
Content-Type: multipart/related; boundary=MIMEBoundary4A7AE55984E7438034;
type="application/xop+xml"; start="<[email protected]>";
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:[email protected]"
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--
J'ai essayé de suivre la documentation et le code d'exemple dans le spring-ws échantillons et pour une raison quelconque, la sortie que je reçois est toujours présent (c'est à dire les données base64 n'est pas un attachement.
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>
Comme vous pouvez le voir, la charge utile n'est pas une pièce jointe. Voici comment j'ai configuré mon application:
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>
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.fichier de schéma 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>
Le fichier est converti à base64binary. Le JAXB clases sont générés correctement. Le point de Terminaison fonctionne, mais il n'est pas y compris le fichier en tant que pièce-jointe. C'est notamment dans le cadre de la balise XML même si j'ai mis mtomEnabled=true.
Ce qui me manque?
Toujours sur cette question? N'ai pas triée il encore sorti, mais j'ai créé une nouvelle question à ce sujet, avec toutes les infos que j'ai pu recueillir. Je vous remercie de votre aide, ou peut-être vous pourriez en faire bon usage. Merci. stackoverflow.com/questions/11564899/...
Voir la réponse ci-dessous.
OriginalL'auteur ziggy | 2012-07-03
Vous devez vous connecter pour publier un commentaire.
Enfin réussi à le faire fonctionner. La configuration est plus ou moins la même chose que ce que j'avais dans mon post original. J'ai eu à mettre à jour le fichier de configuration. Voici comment mon fichier de configuration ressemble maintenant.
Les modifications que j'ai ajouté sont basées sur ce que j'ai lu sur cet article - blog.hpxn.net/2012/06/
Modifier - Un exemple
Voici un exemple (basé sur le printemps des échantillons), qui retourne la pièce jointe dans MTOM format. Je l'ai essayé et la réponse est indiqué ci-dessous:
Noter que je n'ai pas configuré aucun Axiome usines. Les fichiers nécessaires sont énumérés ci-dessous:
schéma.xsd
spring-ws-servlet.xml
web.xml
Pour obtenir la réponse retournée comme un SAAJ attachement plutôt que d'une MTOM pièce jointe, j'ai configurer manuellement la SAAj usines comme décrit dans ce fil Comment puis-je ajouter une pièce jointe à une réponse de la charge utile dans Spring-WS?
J'ai réussi à obtenir à la fois SAAJ et MTOM de travail. Je n'ai pas essayé de gros fichiers comme les fichiers, je suis en train de travailler sur sont assez petites. Laissez-moi un coup d'oeil et de mauvais mise à jour le post pour montrer à la fois la SAAJ et MTOM implémentations.
Si je me souviens bien, pour utiliser SAAJ, vous devez configurer le Message d'usine. Avez-vous des message usines configuré? Qui pourrait être la raison pour laquelle c'est à l'aide de SAAJ dans votre exemple. La configuration ci-dessus ne configurez pas de SAAJ usines d'où MTOM est utilisé par défaut.
J'ai toujours supposé que SAAJ par défaut, comme il est un fonctionnaire de l'API, de toute façon. Dans mon environnement SAAJ est utilisé si aucun n'est défini, que mes dans les journaux:
2012-07-20 09:05:35,219 INFO [org.springframework.ws.soap.saaj.SaajSoapMessageFactory] : Creating SAAJ 1.3 MessageFactory with SOAP 1.1 Protocol
2012-07-20 09:05:35,220 DEBUG [org.springframework.ws.soap.saaj.SaajSoapMessageFactory] : Using MessageFactory class [weblogic.xml.saaj.MessageFactoryImpl]
. Nous utilisons Weblogic, peut-être d'autres applications, serveurs de le faire différemment.Vous avez probablement raison. Je suis à l'aide de Jboss. Voir ma réponse ci-dessous montrant le MTOM (xop) de réponse. Espérons que cela aide.
OriginalL'auteur ziggy