当前位置: 首页 > 面试题库 >

定制SOAP响应的JAX-WS前缀

楚洋
2023-03-14
问题内容

目标

我正在为相当老的(但可悲的是不可更改)的接口实现Web服务。我有一个问题,正在调用我的服务的客户端期望SOAP响应中有某个命名空间,而我很难更改它以使其匹配。

考虑一个世界的例子,我想要这样:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:helloResponse xmlns:ns2="http://test/">
         <return>Hello Catchwa!</return>
      </ns2:helloResponse>
   </S:Body>
</S:Envelope>

看起来像这样:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <customns:helloResponse xmlns:customns="http://test/">
         <return>Hello Catchwa!</return>
      </customns:helloResponse>
   </S:Body>
</S:Envelope>

我在这里找到了与尝试执行的操作类似的操作,但是在使相似的代码正确执行方面遇到困难。(我想坚持使用Metro,而不必更改为cxf或axis)

执行

我的实现JAXBContextFactory返回JAXBRIContext如下所示:

import com.sun.xml.bind.api.JAXBRIContext;
import com.sun.xml.bind.api.TypeReference;
import com.sun.xml.ws.api.model.SEIModel;
import com.sun.xml.ws.developer.JAXBContextFactory;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;

public class HelloJaxbContext implements JAXBContextFactory
{
  @Override
  public JAXBRIContext createJAXBContext(SEIModel seim, List<Class> classesToBind, List<TypeReference> typeReferences) throws JAXBException {
    List<Class> classList = new ArrayList<Class>();
    classList.addAll(classesToBind);

    List<TypeReference> refList = new ArrayList<TypeReference>();
    for (TypeReference tr : typeReferences) {
        refList.add(new TypeReference(new QName(tr.tagName.getNamespaceURI(), tr.tagName.getLocalPart(), "customns"), tr.type, tr.annotations));
    }
    return JAXBRIContext.newInstance(classList.toArray(new Class[classList.size()]), refList, null, seim.getTargetNamespace(), false, null);
  }  
}

该Web服务的一些测试代码很简单:

import com.sun.xml.ws.developer.UsesJAXBContext;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;

@WebService(serviceName = "Hello")
@UsesJAXBContext(value = HelloJaxbContext.class)
public class Hello
{
  @WebMethod(operationName = "hello")
  public String hello(@WebParam(name = "name") String txt)
  {
    return "Hello " + txt + "!";
  }
}

问题

在使用jaxws-rt 2.2.7(来自Maven)的Tomcat7.0.32和Glassfish3.1.2中,以上代码不会影响我的Web服务输出(名称空间前缀仍为“ ns2”)。


问题答案:

如果您从旧服务的WSDL开始,并使用生成了所有各种JAXB批注的请求和响应包装器类wsimport,那么在生成的包中,您应该找到package-info.java诸如

@javax.xml.bind.annotation.XmlSchema(namespace = "http://test/")
package com.example.test;

JAXB提供了一种机制,可在@XmlSchema注释上建议前缀映射,因此您可以尝试修改package-info.java以读取

@javax.xml.bind.annotation.XmlSchema(namespace = "http://test/",
   xmlns = { 
      @javax.xml.bind.annotation.XmlNs(prefix = "customns", 
         namespaceURI="http://test/")
   }
)
package com.example.test;

看看这对生成的消息是否有任何影响。这也具有纯JAXB规范的优点(即不依赖于RI特定的自定义上下文工厂)。

如果需要重新运行wsimport,可以package-info通过将-npa选项传递给来防止它覆盖修改的内容xjc(这告诉它不生成a
package-info.java而是将所有必要的namespace设置放在类级注释上)。确切地,这取决于您的运行方式wsimport

命令行:

wsimport -B-npa ....

蚂蚁:

<wsimport wsdl="..." destdir="..." .... >
  <xjcarg value="-npa" />
</wsimport>

Maven:

<plugin>
  <groupId>org.jvnet.jax-ws-commons</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <goals>
        <goal>wsimport</goal>
      </goals>
      <configuration>
        <xjcArgs>
          <xjcArg>-npa</xjcArg>
        </xjcArgs>
      </configuration>
    </execution>
  </executions>
</plugin>


 类似资料:
  • 我正在为一个相当旧(但遗憾的是无法更改)的接口实现一个web服务。我遇到了一个问题,即调用我的服务的客户端需要SOAP响应中的某个命名空间,而我很难将其更改为匹配。 考虑一个hello world示例,我希望这样: 看起来像这样: 我发现了一些类似于我在这里尝试做的事情,但我很难正确执行类似的代码。(我想继续使用Metro,而不必更换cxf或axis) 我的返回< code > jaxbconte

  • 问题内容: 所以我有一个简单的Web服务: 书的类也很简单: 现在,当您在浏览器的测试器中调用此Web服务时,我得到: 是否有可能将返回的 HashMap 对象显示在标记中,例如 我想要返回标签中的值的原因是,从客户端来看,我在网页中使用jQuery AJAX调用此Web服务,而我得到的响应XML只是空标签。我如何从AJAX客户端获得真实的账面价值? 这是我的AJAX网络代码: 我使用简单的Hel

  • 在一个 Java 项目中,我使用 jax-ws 和 wsdl 创建了一个 Web 服务客户端。该请求是有效的 xml,但缺少此特定 SOAP 调用中所需的前缀。目前,我通过手动将xmlns={@javax.xml.bind.annotation.XmlNs(前缀=“gen”,namespaceURI=“http://schemas...”)})添加到package-info.java类来解决此问题

  • 问题内容: 我正在尝试创建一个独立的客户端来使用某些Web服务。我必须将我的用户名和密码添加到SOAP Header。我尝试添加凭据,如下所示: 当我在服务上调用方法时,出现以下异常: 我究竟做错了什么?如何将这些属性添加到SOAP Header? 编辑:我正在使用JDK6中包含的JAX-WS 2.1。我现在正在使用JAX-WS 2.2。我现在得到以下异常: 如何创建此令牌? 问题答案: 不是10

  • 我需要解析jax-ws-rest响应,我尝试了以下两种解析响应的方法。两者都很好。但我需要知道最有效的实施方式。请告诉我你的看法。 < li >使用getEntity对象并获取响应作为输入流。 < li >使用Jackson object mapper read value()-将inputstream转换为java对象。 < li >使用嵌套java类的getters和setters获取响应对象

  • JAX-WS (JavaTM API for XML-Based Web Services)规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。 在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要