vinculado prefijo nombres lectura está espacio error definido web-services spring soap spring-ws

web-services - lectura - el prefijo del espacio de nombres no está definido



Eliminar el prefijo del espacio de nombres en la salida del servicio web Spring WS (2)

Creé un servicio web usando Spring-WS. Cuando envío una solicitud al servicio web, esta es la respuesta que recibo en soap-ui:

enter code here <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <ns2:SendResponse xmlns:ns2="http://mycompany.com/schema/"> <ns2:SendResult> <ns2:Token>A00179-02</ns2:Token> </ns2:SendResult> </ns2:SendResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

¿Hay alguna manera de deshacerse del prefijo del espacio de nombre "ns2" de la respuesta? Intenté algunas opciones: 1) Actualicé manualmente package-info.java para configurar el prefijo a "":

@XmlSchema(namespace = "http://mycompany.com/schema/", xmlns = { @XmlNs(namespaceURI = "http://mycompany.com/schema/", prefix = "") }, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package com.example.foo.jaxb;

2) Establezca el prefijo en "" en el objeto QName en la clase de punto final:

return new JAXBElement<SendAndCommitResponse>(new QName("http://mycompany.com/schema/", "SendResponse",""), SendResponse.class, response);

Ambos no funcionaron. ¿Cómo deshacerse del prefijo del espacio de nombres "ns2"?


Finalmente encontré una solución para esto.

Mi problema fue causado por JDK 6 que no envía una versión completa de rt.jar ( http://www.oracle.com/technetwork/java/javase/compatibility-137541.html ).

Agregué lo siguiente a mi configuración maven

<dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.6</version> </dependency>

Y luego se agregó

@XmlSchema(namespace = "http://mycompany.com/schema/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED).

En el paquete-info.java (como sugiere @acdcjunior arriba)


fue dificil

primero: crea una clase que intercepte solicitudes y respuestas de jabón:

package examples.webservices.handler; import java.lang.reflect.Method; import java.util.Collections; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPMessage; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class CorrigirConteudoRequisicaoSOAP implements SOAPHandler<SOAPMessageContext> { public Set<QName> getHeaders() { return Collections.emptySet(); } public boolean handleMessage(SOAPMessageContext messageContext) { this.corrigirConteudoRequisicaoSOAP(messageContext); return true; } private void corrigirConteudoRequisicaoSOAP(SOAPMessageContext messageContext){ SOAPMessage msg = messageContext.getMessage(); try { NodeList childNodes = msg.getSOAPBody().getChildNodes(); for(int k = 0; k < childNodes.getLength(); k++){ Node item = childNodes.item(k); String localName = item.getLocalName(); { item.setPrefix(""); Method m = SOAPElement.class.getDeclaredMethod("setElementQName", QName.class); //I was forced to use reflection because the method setElementQname is not //visible, neither the class that implements it m.invoke(item, new QName("", item.getLocalName())); msg.saveChanges(); } } } catch (Exception e) { try { msg.writeTo(System.out); } catch (Exception e1) { e1.printStackTrace(); } System.out.println(); } } public boolean handleFault(SOAPMessageContext messageContext) { return true; } public void close(MessageContext messageContext) { } public static void main(String[] args)throws Exception { } }

segundo: asociar el servicio al mango del jabón

public class PortalFornecedor { public Usuario getUsuario(){ XIF367Afae09A3344Fbf2E1De819D6EcbaService classeComNomeFeio = new XIF367Afae09A3344Fbf2E1De819D6EcbaService(); Usuario service = classeComNomeFeio.getHTTPPort(); BindingProvider bp = (BindingProvider)service; Map<String, Object> requestContext = bp.getRequestContext(); requestContext.put(BindingProvider.USERNAME_PROPERTY, "user"); requestContext.put(BindingProvider.PASSWORD_PROPERTY, "pass"); this.handle(service); return service; } public Object getDashboard(){ return ""; } // here we associate the service to soap handle private BindingProvider handle(Usuario service) { BindingProvider bp = (BindingProvider)service; @SuppressWarnings("rawtypes") List<Handler> chain = new ArrayList<Handler>(); chain.add(new CorrigirConteudoRequisicaoSOAP()); bp.getBinding().setHandlerChain(chain); return bp; } public static void main(String[] args) { PortalFornecedor pf = new PortalFornecedor(); Usuario usuario = pf.getUsuario(); LoginExecutarIN in = new LoginExecutarIN(); generated.Usuario user = new generated.Usuario(); user.setLogin("onias"); user.setSenha("12345"); user.setCodigoUsuario(0); in.setParametroEntrada(user); try { LoginExecutarOUT out = usuario.loginExecutar(in); // SOAPMessageContext.getMessage(); System.out.println(out.getRegistroSelecionado().getNome()); } catch (Exception e) { e.printStackTrace(); } } }