Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带接口的RESTAPI-JAXB_Java_Rest_Jaxb - Fatal编程技术网

Java 带接口的RESTAPI-JAXB

Java 带接口的RESTAPI-JAXB,java,rest,jaxb,Java,Rest,Jaxb,我正在使用Java接口的实现。 例如:可以有很多支付方式,如信用卡、手机等。 我正在制作一个包含接口的REST API——我如何在JAXB中映射它,目前它给了我JAXBEException发生:2个IllegalAnnotationException计数 目前我正在使用ApacheCXF和JAXb @XmlRootElement public class Payment { @XmlElement private PaymentType paymentType; @Xml

我正在使用Java接口的实现。 例如:可以有很多支付方式,如信用卡、手机等。 我正在制作一个包含接口的REST API——我如何在JAXB中映射它,目前它给了我JAXBEException发生:2个IllegalAnnotationException计数

目前我正在使用ApacheCXF和JAXb

@XmlRootElement
public class Payment {
    @XmlElement
    private PaymentType paymentType;
    @XmlElement
    private long price;

    public Payment() {
    }

    public Payment(final PaymentType paymentType, final long price) {
        super();
        this.paymentType = paymentType;
        this.price = price;
    }
}

@Path("/trial")
public class TrialService {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Payment> getPayments() {
        final List<Payment> payments = new LinkedList<Payment>();
        final CreditCardDetails creditCard = new CreditCardDetails(
                "8767798778", "123", 12, 2016);
        final Payment payment = new Payment(creditCard, 10);
        payments.add(payment);
        return payments;
    }
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public PaymentDetails startPayment(final PaymentDetails paymentDetails) {
    return paymentDetails;
}
}

public class CreditCardDetails implements PaymentType {

    @XmlElement
    private String creditCardNumber;
    @XmlElement
    private String cvv;
    @XmlElement
    private int expirationMonth;
    @XmlElement
    private int expirationYear;

    public CreditCardDetails() {
    }

    @SuppressWarnings("javadoc")
    public CreditCardDetails(
            // final BillingAddress billingAddress,
            final String creditCardNumber, final String cvv,
            final int expirationMonth, final int expirationYear) {
        super();
        this.creditCardNumber = creditCardNumber;
        this.cvv = cvv;
        setExpirationMonth(expirationMonth);
        setExpirationYear(expirationYear);
    }
}
@XmlRootElement
公共类支付{
@XmlElement
私人付费类型付费类型;
@XmlElement
私人多头价格;
公共支付(){
}
公共支付(最终支付类型支付类型,最终长期价格){
超级();
this.paymentType=paymentType;
这个价格=价格;
}
}
@路径(“/试验”)
公共类TrialService{
@得到
@产生(MediaType.APPLICATION_JSON)
公共列表getPayments(){
最终列表付款=新建LinkedList();
最终信用卡详细信息信用卡=新信用卡详细信息(
"8767798778", "123", 12, 2016);
最终付款=新付款(信用卡,10);
付款。添加(付款);
归还款项;
}
@职位
@使用(MediaType.APPLICATION_JSON)
@产生(MediaType.APPLICATION_JSON)
公共付款明细开始付款(最终付款明细付款明细){
退还款项详情;
}
}
公共类CreditCardDetails实现PaymentType{
@XmlElement
私有字符串creditCardNumber;
@XmlElement
私有字符串cvv;
@XmlElement
私人int到期月;
@XmlElement
私人投资到期年;
公共信用卡详情(){
}
@抑制警告(“javadoc”)
公众信用卡详情(
//最终计费地址计费地址,
最终字符串creditCardNumber,最终字符串cvv,
最终整数到期月份,最终整数到期年份){
超级();
this.creditCardNumber=creditCardNumber;
这是cvv=cvv;
setExpirationMonth(expirationMonth);
setExpirationYear(expirationYear);
}
}
我应该如何映射这一点,还是应该使用完全不同的方法

编辑: 对于POST方法,我收到了一笔付款。付款可以包含任何对象,如信用卡、钱包等。我应该提供什么注释,以便正确地对其进行注释。
当前它抛出一个JAXB异常。

您得到的完整错误消息是:

由以下原因引起:com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:2次IllegalAnnotationExceptions PaymentType是一个接口,JAXB无法处理接口。

您需要为元素使用concreate类,或者将其指向
@xmlement
注释的
type
属性:

@XmlElement(type = CreditCardDetails.class)
private PaymentType paymentType;
@XmlAnyElement(lax=true)
PaymentType paymentType;
如果有更多类使用
PaymentType
接口,则可以使用以下解决方案:

 @XmlAnyElement
 @XmlElementRefs({
    @XmlElementRef(type=CreditCardDetails.class),
    @XmlElementRef(type=Wallet.class)   
 })
 PaymentType paymentType;
@xmlementrefs
列表可以包含任意数量的元素,但必须列出所有可能的元素
CreditCardDetails
Wallet
必须用
@XmlRootElement
注释

您可以跳过@XmlElementRefs注释:

@XmlElement(type = CreditCardDetails.class)
private PaymentType paymentType;
@XmlAnyElement(lax=true)
PaymentType paymentType;

但在这种情况下,如果不使用注册表,请确保在JAXB上下文中有任何必需的类,并使用@xmlseealway({CreditCardDetails.class,Wallet.class})为类添加
PaymentType
字段

您的解决方案可行,但并不理想。我使用的是一个界面,因为我可以在运行时获得信用卡、手机或钱包。如果我想预先声明我获得了信用卡,我一开始就不会使用接口。现在检查答案。这就是您需要的吗?在
@xmlanyement
上添加了
lax=true
,这样它将映射到对象而不仅仅是dom。嘿,感谢您的编辑,它工作得很好。我尝试了XmlAnyElement和XmlElementRefs,但当我尝试使用lax=true时,这似乎不起作用。我是否用XmlElementSee为接口添加了注释?是否有注释可以帮助我正确地对对象进行理想化?