繁体   English   中英

Jax-WS接口作为参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM