我越来越熟悉Java使用Jax-ws(或JAXB,不确定,反正...)的网络服务。
我用一个单一的网络服务创建了一个小项目。WS有唯一的endpoint,称为传输,并返回继承ITransferResult接口的对象。
Web服务合同
//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface IBankWebSrv {
@WebMethod
ITransferResult transfer(String accountNumber, double amount);
}
Web服务实现
//Service Implementation
@WebService(endpointInterface = "Contracts.IBankWebSrv")
public class BankWebSrv implements IBankWebSrv {
@Override
public ITransferResult transfer(String accountNumber, double amount) {
ITransferResult result = new TransferResult();
// TODO logic here
result.setSuccessful(true);
return result;
}
}
转让结果合同
@XmlJavaTypeAdapter(TransferResult.class)
public interface ITransferResult {
boolean isSuccessful();
void setSuccessful(boolean successful);
}
转移结果实现
public class TransferResult extends XmlAdapter<TransferResult, ITransferResult>
implements ITransferResult {
@XmlElement
boolean successful;
public boolean isSuccessful() {
return this.successful;
}
public void setSuccessful(boolean successful) {
this.successful = successful;
}
@Override
public TransferResult marshal(ITransferResult v) throws Exception {
return (TransferResult) v;
}
@Override
public ITransferResult unmarshal(TransferResult v) throws Exception {
return (ITransferResult) v;
}
}
当我发布我的Web服务时,我得到以下错误:
异常线程"main"javax.xml.ws.WebServiceExcture:无法创建JAXBContext...
原因:java。安全PrivilegedActionException:com。太阳xml。内部的绑定v2。运行时。IllegalAnnotationsException:1 IllegalAnnotationException计数ITransferResult是一个接口,JAXB无法处理接口。此问题与以下位置有关:在ITransferResult
我已经看了SO寻找答案,并应用了最重复的技巧,但没有一个对我有用。
我错过了什么?
它似乎没有将TransferResult
类上的注释作为可绑定元素进行处理。这意味着您可能需要将@xmlseealway(TransferResult.class)
添加到接口(ITransferResult
)。您还需要将@XmlRootElement
放在序列化实现(TransferResult
)上,以便生成实际的XML文档,而不仅仅是在其他文档中使用的类型。这是因为当JAX-WS实现创建内部使用的JAXB上下文时,它只使用您在服务接口上定义的参数和结果类型作为JAXB的参数。newInstance(…)
;这里没有列出的任何内容(或者可以通过简单地遵循类型来查找)都将被省略,并且使用的类型适配器完全可能没有被处理为注释(毕竟,它们不需要是它们正在调整的接口的实例,也不需要是正在调整的类型的接口)。
(是的,SOAP响应是一个附加文档,但是推荐的使用方法是在SOAPBody
中放入一个元素,这意味着您需要知道元素的name
。这意味着一个@XmlRootElement
注释。(
警告:我不是100%确定这会起作用。如果没有,您将不得不切换到使用具体类型(可能是直POJOs)作为结果。这可能不是一件特别可口的事情,但至少很容易做到...
在@SOAPBinding(style=style.RPC)
虽然这是一个老问题,但我想我会回答它,因为这是人们遇到的常见例外。
这两种风格在高级水平上的区别如下
>
文档:返回类型和方法参数在单独的XSD中得到了清晰的解释,每个类型都有详细的说明——在自定义数据类型的情况下很有帮助(例如在您的情况下ITransferResult
或java.util.列表
)。
RPC:这些类型在WSDL中以简单的方式定义。
在我的应用程序中有一个对象树。要构成该树,每个对象都有一个父引用。由于某些对象类型可以是多个父对象类型的子对象,所有潜在的父对象类型都通过实现公共接口来统一。我尽可能地缩小了问题的范围(JAXB抱怨父成员变量(注释为@XmlIDREF和@xmldattribute)是一个接口): 这是我在尝试运行它时得到的例外: com.sun.xml.internal.bind.v2.runtime.非法注释异
问题内容: 尝试部署应用程序时,似乎出现以下异常: 我的代码运行良好,直到将返回类型从List更改为List > 这是部分Web服务: 我也尝试过通过删除@SOAPBinding并尝试使用默认值,但是会出现相同的结果。 感谢任何帮助 更新 我要注意一些事情。我将所有List更改为ArrayList,然后进行编译。我之所以说编译但不起作用是因为它的行为很奇怪。我得到一个类型为Object的对象:Re
问题内容: 嗨,我是Android编程的新手,我想问的问题可能很简单,但是我对如何使其工作一无所知,请多多包涵。 我从Android开发人员网站安装了android-sdk和相关工具。我按照他们的指示创建了HelloWorld应用,但出现了一些我不理解的错误。 文件MainActivity.java是一个自动生成的文件,在以下位置,我不断出现此文件错误: 因此,我尝试浏览生成的class文件中的l
我正在尝试使用restTemplate(Spring)和Jackson 2.3.0构建一个JSON Web服务消费者 问题在于pojo的绑定,如下所示: Jackson输出以下错误: org.springframework.http.converter.HttpMessageNotReadableException:无法读取JSON:无法识别的字段"montant_TTC"(类com.bouygt
我使用CXF2.7.5调用Web服务。我使用wsdl2java程序(在命令行MSDOS和maven中)生成了客户机类。我必须使用xmlbeans数据绑定,因为使用jaxb(默认数据绑定)时会出现一些错误,并且无法修改服务器端。因此,使用xmlbeans数据绑定参数,生成就可以了。 我用以下方法调用web方法: ... 当我调用webmethods时,它可以在简单的java程序上完美地工作,但在po
我试图从通过JAXB生成的类序列化XML。 班级: 文件“package-info.java”: 编组器(简化,无需错误处理): 此代码生成: 我期待这样的事情: 我有一个类似的代码并且工作正常,但是我不明白为什么这个代码不显示命名空间。有线索吗?谢谢!