Java Jax-WS接口作为参数

Java Jax-WS接口作为参数,java,web-services,interface,jaxb,Java,Web Services,Interface,Jaxb,尝试使用接口作为jax-ws-web服务的参数 接口 import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlRootElement @XmlJavaTypeAdapter(TransactionBase.TransactionableAdapter.class) public interface Transactiona

尝试使用接口作为jax-ws-web服务的参数 接口

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlJavaTypeAdapter(TransactionBase.TransactionableAdapter.class)
public interface Transactionable {

public int getRecid() ;
public void setRecid(int recid) ;
}
实施

import com.tr.route.transactions.Transactionable;
@XmlRootElement 
@XmlType(name = "Transactionable")
public  class TransactionBase implements Transactionable{

    private int recid;
    private String ref;
    public TransactionBase(String type ) {
    System.out.println("TransactionBase.Constructor with param:" +       type);
     }

   public static TransactionBase valueOf(String allObject) {
    System.out.println("TransactionBase.valueOf:");
    TransactionBase rezult =  new TransactionBase(allObject);
    return rezult;
   }
    public int getRecid() {
        return recid;
    }

    public void setRecid(int recid) {
        this.recid = recid;
    }
    // adapter
  public static class TransactionableAdapter
    extends XmlAdapter<TransactionBase, Transactionable> {

    @Override
    public TransactionBase marshal(Transactionable o)
        throws Exception {
        System.out.println("TransactionableAdapter:mashal:");           
        return (TransactionBase)o;
    } 

    @Override
    public Transactionable unmarshal(TransactionBase o)
        throws Exception {
        System.out.println("TransactionableAdapter:unmashal:");
    return (Transactionable)o;
    }
    }
}
}

无论我做了什么,我都会得到:

Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions Transactionable is an interface, and JAXB can't handle interfaces.
请不要将我重定向到:

稍后编辑:


我正在使用jersey实现。

您需要为参数类型使用一些JavaBean类,否则,JAX-RS将无法在调用方法之前为您创建和填充参数

编辑: 引述自:

通常,方法参数的Java类型可能:

是原始类型

具有接受单个字符串参数的构造函数

有一个名为valueOf或fromString的静态方法,该方法接受单个字符串参数(例如,请参见Integer.valueOf(String)和java.util.UUID.fromString(String))

拥有javax.ws.rs.ext.ParamConverterProvider JAX-rs扩展SPI的注册实现,该扩展SPI返回一个javax.ws.rs.ext.ParamConverter实例,该实例能够对类型进行“from string”转换。或

是列表、集合或分类集合,其中T满足上述2或3。生成的集合是只读的


为什么要坚持在接口上保留jaxb注释?为什么不把它们放在TransactionBase上呢?嗨,适配器似乎没有被调用,因为我从来没有在任何调用日志中看到它。您想说我不能使用接口作为参数或为接口进行一些映射吗?你能发送一个文档链接吗?嗨@Michael Bar Sinai谢谢你的帮助。我在方法中添加了@XmlElement(type=TransactionBase.class),将Long改为int,添加了constructor和valueOf()方法,现在我得到了一个不同的错误。InboundJAXRResponse{ClientResponse{method=POST,uri=,status=415,reason=Unsupported Media Type}如何发送数据?如果是JSON,则需要向HTTP请求添加一个“Content-type:application/JSON”头。Hi@michaelClient client=ClientBuilder.newClient();WebTarget webResource=client.target(“);Transactionable transaction=new TransactionBase();transaction.setRecid(100);Response-Response=client.target(“).request().accept(MediaType.APPLICATION_XML).post(Entity.Entity(transaction,MediaType.APPLICATION_XML));我只使用xml,没有JSONOK,所以请尝试添加“Content-type:application/xml”头。
Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions Transactionable is an interface, and JAXB can't handle interfaces.