在一个 Java 项目中,我使用 jax-ws 和 wsdl 创建了一个 Web 服务客户端。该请求是有效的 xml,但缺少此特定 SOAP 调用中所需的前缀。目前,我通过手动将xmlns={@javax.xml.bind.annotation.XmlNs(前缀=“gen”,namespaceURI=“http://schemas...”)})添加到package-info.java类来解决此问题,但觉得这不是最好的解决方案,因为软件包信息是自动创建的,如果由于任何原因再次生成源,我的解决方案将被覆盖。
我怀疑我的wsdl里面少了点什么
下面是wsdl:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:tns="http://xmlns.example.com/1308658932768" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns0="http://schemas.triennium.com/Servicepunt/gen" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="Untitled" targetNamespace="http://xmlns.example.com/1308658932768">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.triennium.com/Servicepunt/gen"
targetNamespace="http://schemas.triennium.com/Servicepunt/gen"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="CallInfo">
<xs:complexType>
...
</xs:complexType>
</xs:element>
<xs:element name="ResponseStatus">
<xs:complexType>
...
</xs:complexType>
</xs:element>
<xs:element name="Credentials">
<xs:complexType>
...
</xs:complexType>
</xs:element>
<xs:element name="AuthenticateAannemerRequest">
<xs:complexType>
...
</xs:complexType>
</xs:element>
<xs:element name="AuthenticateAannemerResponse">
<xs:complexType>
...
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:service name="WSDL_Generator.2.0.2">
<wsdl:port name="AuthenticateAannemer.2.0.2" binding="tns:AuthenticateAannemer.2.0.2Binding">
<soap:address location="http://10.11.2.12:2592"/>
</wsdl:port>
</wsdl:service>
<wsdl:portType name="AuthenticateAannemer">
<wsdl:operation name="AuthenticateAannemer">
<wsdl:input message="tns:AuthenticateAannemerRequest"/>
<wsdl:output message="tns:AuthenticateAannemerResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AuthenticateAannemer.2.0.2Binding" type="tns:AuthenticateAannemer">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="AuthenticateAannemer">
<soap:operation style="document" soapAction="/AuthenticateAannemer.2.0.2/AuthenticateAannemer"/>
<wsdl:input>
<soap:body use="literal" parts="input"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal" parts="output"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:message name="AuthenticateAannemerRequest">
<wsdl:part name="input" element="ns0:AuthenticateAannemerRequest"/>
</wsdl:message>
<wsdl:message name="AuthenticateAannemerResponse">
<wsdl:part name="output" element="ns0:AuthenticateAannemerResponse"/>
</wsdl:message>
</wsdl:definitions>
下面是不带前缀的请求:
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<AuthenticateAannemerRequest xmlns="http://schemas.triennium.com/Servicepunt/gen">
<CallInfo>
<Customer>...</Customer>
<Module>...</Module>
<Version>...</Version>
</CallInfo>
<Credentials>
<Username>...</Username>
<Password>...</Password>
</Credentials>
</AuthenticateAannemerRequest>
</S:Body>
</S:Envelope>
这是我想要的请求:
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<gen:AuthenticateAannemerRequest xmlns:gen="http://schemas.triennium.com/Servicepunt/gen">
<gen:CallInfo>
<gen:Customer>...</Customer>
<gen:Module>...</Module>
<gen:Version>...</Version>
</gen:CallInfo>
<gen:Credentials>
<gen:Username>...</Username>
<gen:Password>...</Password>
</gen:Credentials>
</gen:AuthenticateAannemerRequest>
</S:Body>
</S:Envelope>
编辑:在第二个示例中为名称空间声明添加前缀,该前缀一开始就在那里,但在c/p代码时不知何故丢失了。
如果从模式生成类,则可以添加JAXB绑定文件。
请看这个答案,它是该文件的一个模板,指定了模式默认名称空间的前缀。
然后在使用genration工具时指定附加绑定文件。
编辑
您可以使用的一个示例文件是:
<?xml version="1.0"?>
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd
http://jaxb2-commons.dev.java.net/namespace-prefix http://java.net/projects/jaxb2-commons/sources/svn/content/namespace-prefix/trunk/src/main/resources/prefix-namespace-schema.xsd">
<jxb:bindings>
<jxb:schemaBindings>
<jxb:package name="your-package-name-here" />
</jxb:schemaBindings>
<jxb:bindings>
<namespace:prefix name="http://schemas.triennium.com/Servicepunt/gen" />
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
请记住在生成类时使用jaxb-commons插件。
您需要手动将包信息.java编译为类文件。
@XmlRootElement(namespace = "http://schemas.triennium.com/Servicepunt/gen")
public class AuthenticateAannemerRequest implements Serializable {
private CallInfo callInfo;
private Credentials credentials;
public AuthenticateAannemerRequest() {
}
@XmlElement(namespace = "http://schemas.triennium.com/Servicepunt/gen")
public CallInfo getCallInfo() {
return callInfo;
}
public void setCallInfo(CallInfo callInfo) {
this.callInfo = callInfo;
}
@XmlElement(namespace = "http://schemas.triennium.com/Servicepunt/gen")
public Credentials getCredentials() {
return credentials;
}
public void setCredentials(Credentials credentials) {
this.credentials = credentials;
}
}
问题内容: 目标 我正在为相当老的(但可悲的是不可更改)的接口实现Web服务。我有一个问题,正在调用我的服务的客户端期望SOAP响应中有某个命名空间,而我很难更改它以使其匹配。 考虑一个世界的例子,我想要这样: 看起来像这样: 我在这里找到了与尝试执行的操作类似的操作,但是在使相似的代码正确执行方面遇到困难。(我想坚持使用Metro,而不必更改为cxf或axis) 执行 我的实现返回如下所示: 该
我正在为一个相当旧(但遗憾的是无法更改)的接口实现一个web服务。我遇到了一个问题,即调用我的服务的客户端需要SOAP响应中的某个命名空间,而我很难将其更改为匹配。 考虑一个hello world示例,我希望这样: 看起来像这样: 我发现了一些类似于我在这里尝试做的事情,但我很难正确执行类似的代码。(我想继续使用Metro,而不必更换cxf或axis) 我的返回< code > jaxbconte
问题内容: 是否有一种简单的方法(即:不使用代理)来访问对使用JAX-WS参考实现(JDK 1.5及更高版本中包含的参考发布)发布的Web服务的原始请求/响应XML的访问?我需要做的是通过代码做到这一点。仅通过巧妙的日志记录配置将其记录到文件中就可以了,但足够了。 我知道可能存在其他更复杂和完整的框架,但是我想使其尽可能地简单,而axis,cxf等都增加了我想避免的大量开销。 谢谢! 问题答案:
问题内容: 我正在尝试创建一个独立的客户端来使用某些Web服务。我必须将我的用户名和密码添加到SOAP Header。我尝试添加凭据,如下所示: 当我在服务上调用方法时,出现以下异常: 我究竟做错了什么?如何将这些属性添加到SOAP Header? 编辑:我正在使用JDK6中包含的JAX-WS 2.1。我现在正在使用JAX-WS 2.2。我现在得到以下异常: 如何创建此令牌? 问题答案: 不是10
嗨,有人能帮我吗。 如何请求soapweb服务并获取xml响应。Senario:使用SOAPUIIM发送带有用户名、密码身份验证的wsdl url,我还将发送SOAPXML数据并获得响应。如何使用nodejs或sails实现同样的目标。 在SoapUi中,我的soapxml请求如下 我的Soap身份验证就像 $UserName:xyz 我的wsdl url是http://esbuatt1wm.it
问题内容: 我构建了一个最小的Web服务,并使用javax.xml.ws.Endpoint发布了它。如果我尝试获得WSDL, 它就可以正常工作。 尝试在接收它,我什么也没收到。该地址与本地主机相同。 是否可以在不提供地址的情况下发布网络服务? 将代码更改为 在IP地址上获取wsdl,但不在本地主机上获取。 是否没有可能仅定义端口? 问题答案: 您可以尝试在0.0.0.0上发布它吗?