我使用Jax-ws熟悉Java中的Web服务(或JAXB,不管怎样,不管怎样......)。
我用一个网络服务创建了一个小项目。 WS具有唯一的端点,称为transfer,并返回继承ITransferResult接口的对象。
网络服务合约
//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface IBankWebSrv {
@WebMethod
ITransferResult transfer(String accountNumber, double amount);
}
网络服务实施
//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;
}
}
TransferResult合同
@XmlJavaTypeAdapter(TransferResult.class)
public interface ITransferResult {
boolean isSuccessful();
void setSuccessful(boolean successful);
}
TransferResult实施
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;
}
}
当我发布我的网络服务时,我收到以下错误:
线程中的异常&#34; main&#34; javax.xml.ws.WebServiceException:无法执行 创建JAXBContext ...
引起:java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1 IllegalAnnotationExceptions的计数 ITransferResult是一个接口, 并且JAXB无法处理接口。这个问题与之相关 以下位置:在ITransferResult
我已经查看了SO的答案并应用了最重复的提示,但它们都没有为我工作。
我错过了什么?
答案 0 :(得分:4)
您可能需要在@SOAPBinding(style = Style.RPC)
虽然这是一个老问题,但我认为我会回答它,因为它是人们遇到的常见例外。
高级别中两种风格的区别如下
文档:返回类型和方法参数在单独的XSD中清楚地解释,每种类型都有详细说明 - 在自定义数据类型的情况下很有用(例如{{1} }或ITransferResult
)。
RPC :这些类型以简单的方式在WSDL中定义。
答案 1 :(得分:0)
看起来它并没有将TransferResult
类上的注释作为可绑定元素进行处理。这意味着您可能需要将@XmlSeeAlso(TransferResult.class)
添加到界面(ITransferResult
)。您还需要将@XmlRootElement
放在序列化实现(TransferResult
)上,以便生成实际的XML文档,而不仅仅是您在其他文档中使用的类型。这是因为当JAX-WS实现创建它在内部使用的JAXB上下文时,它只使用您在服务接口上定义的参数和结果类型作为JAXB.newInstance(…)
的参数;那些字面上没有列出的东西(或者可以通过简单找到类型之后的东西)将被省略,并且完全有可能所使用的类型适配器不会被处理用于注释(毕竟,它们不是&# 39; t需要是他们适应的界面的实例,被调整的类型也不需要是一个界面。
(是的,SOAP响应是一个封闭文档,但推荐使用它的方法是将单个元素放在SOAP Body
中,这意味着您需要知道name
的元素。这意味着@XmlRootElement
注释。)
警告:我不能100%确定这会有效。如果它没有,你将不得不切换到使用具体类型(可能是直接的POJO)作为结果。它可能不是特别可口的东西,但它至少很容易做到......