Java JAXB无法处理接口-我缺少什么?
我越来越熟悉使用Jax-ws(或者JAXB,无论如何也不确定…)的Java中的web服务 我用一个Web服务创建了一个小项目。WS具有唯一名为transfer的端点,并返回继承ITransferResult接口的对象 网络服务合同Java JAXB无法处理接口-我缺少什么?,java,web-services,jaxb,Java,Web Services,Jaxb,我越来越熟悉使用Jax-ws(或者JAXB,无论如何也不确定…)的Java中的web服务 我用一个Web服务创建了一个小项目。WS具有唯一名为transfer的端点,并返回继承ITransferResult接口的对象 网络服务合同 //Service Endpoint Interface @WebService @SOAPBinding(style = Style.RPC) public interface IBankWebSrv { @WebMethod ITransferRe
//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface IBankWebSrv {
@WebMethod
ITransferResult transfer(String accountNumber, double amount);
}
@XmlJavaTypeAdapter(TransferResult.class)
public interface ITransferResult {
boolean isSuccessful();
void setSuccessful(boolean successful);
}
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;
}
}
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;
}
}
转让结果合同
//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface IBankWebSrv {
@WebMethod
ITransferResult transfer(String accountNumber, double amount);
}
@XmlJavaTypeAdapter(TransferResult.class)
public interface ITransferResult {
boolean isSuccessful();
void setSuccessful(boolean successful);
}
传输结果实施
//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;
}
}
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;
}
}
公共类TransferResult扩展了XmlAdapter
实现ITransferResult{
@XmlElement
布尔成功;
公共布尔值isSuccessful(){
返回这个。成功;
}
public void setSuccessful(布尔值成功){
成功的,成功的;
}
@凌驾
公共TransferResult封送处理程序(ITransferResult v)引发异常{
返回(传递结果)v;
}
@凌驾
公共ITransferResult unmarshal(TransferResult v)引发异常{
返回(ITransferResult)v;
}
}
发布web服务时,出现以下错误:
线程“main”javax.xml.ws.WebServiceException中的异常:无法
创建JAXBContext
原因:java.security.PrivilegedActionException:
com.sun.xml.internal.bind.v2.runtime.illegalannotations异常:1
IllegalAnnotationExceptions计数ITransferResult是一个接口,
JAXB不能处理接口。这个问题与
以下地点:ITransferResult
我已经仔细研究了答案,并应用了最重复的技巧,但没有一个对我有用
我遗漏了什么?它似乎没有将
TransferResult
类上的注释作为可绑定元素进行处理。这意味着您可能需要将@xmlseealway(TransferResult.class)
添加到接口(ITransferResult
)。您还需要将@XmlRootElement
放在序列化实现(TransferResult
)上,以便生成实际的XML文档,而不仅仅是在其他文档中使用的类型。这是因为当JAX-WS实现创建其内部使用的JAXB上下文时,它只使用您在服务接口上定义的参数和结果类型作为JAXB.newInstance(…)
的参数;这里没有列出的任何内容(或者可以通过简单地遵循类型来查找)都将被省略,并且使用的类型适配器完全可能没有被处理为注释(毕竟,它们不需要是它们正在调整的接口的实例,也不需要是正在调整的类型的接口)
(是的,SOAP响应是一个随附文档,但建议使用它的方法是将单个元素放入SOAP正文
,这意味着您需要知道元素的名称
。这意味着@XmlRootElement
注释。)
警告:我不是100%确定这会起作用。否则,您将不得不切换到使用具体类型(可能是直POJO)作为结果。这可能不是一件特别令人愉快的事情,但至少很容易做到…在
@SOAPBinding(style=style.RPC)
虽然这是一个老问题,但我想我会回答它,因为这是人们遇到的常见例外
两种风格在高层次上的区别如下
- 文档:返回类型和方法参数在单独的XSD中详细解释了每种类型-对于自定义数据类型(示例为
或ITransferResult
)java.util.List
- RPC:类型在WSDL中以简单的方式定义