[英]Jax-WS interface as parameter
尝试使用接口作为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;
}
}
}
Web服务类
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/ExternalTransactions")
public class ExternalTransactions {
@POST
@Produces( MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
@Path("/insertTransaction")
@XmlElement(type=TransactionBase.class)
public String insertTransaction(Transactionable insertRequest) {
String insertResponse = "method was called";
return insertResponse;
}
}
无论我做了什么,我得到:
Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions Transactionable is an interface, and JAXB can't handle interfaces.
请不要将我重定向到: http : //blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html
后来编辑:
我正在使用球衣实施。
您需要为参数类型使用一些java-bean类 - 否则,在调用它之前,JAX-RS将无法为您创建和填充参数。
编辑:引自https://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e2145 :
通常,方法参数的Java类型可以:
是一种原始的类型;
有一个接受单个String参数的构造函数;
有一个名为valueOf或fromString的静态方法接受单个String参数(例如,参见Integer.valueOf(String)和java.util.UUID.fromString(String));
有一个javax.ws.rs.ext.ParamConverterProvider JAX-RS扩展SPI的注册实现,它返回一个能够为该类型进行“from string”转换的javax.ws.rs.ext.ParamConverter实例。 要么
Be List,Set或SortedSet,其中T满足上面的2或3。 生成的集合是只读的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.