2

i'm having a stack trace trying to use inheritance with moxy, somebody can give some advice. Bellow some abstract of the java code and the stack error. Thanks in advance!!!

Bussines objects

public abstract class ContactInfo {

}
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="address")
public class Address extends ContactInfo {

    private String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

}
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="phonenumber")
public class PhoneNumber extends ContactInfo {

}
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="customer")
public class Customer {

    private ContactInfo contactInfo;

    @XmlElementRef
    public ContactInfo getContactInfo() {
        return contactInfo;
    }

    public void setContactInfo(ContactInfo contactInfo) {
        this.contactInfo = contactInfo;
    }

}

cxf web service

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;

import packagename.payment.ContactInfo;

import packagename.payment.Payment;

import packagename.payment.PaymentResponse;


@Path("/payment/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface PaymentServerRest {

    @POST
    @Path("aja1/")
    public PaymentResponse aja1(Customer customer);


}

import java.util.ArrayList;
import java.util.List;

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;

import packagename.payment.server.PaymentServerRest;

import packagename.payment.Address;

import packagename.payment.ContactInfo;

import packagename.payment.Customer;

import packagename.payment.PaymentResponse;

import packagename.payment.PhoneNumber;


@Path("/payment/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class PaymentServerRestImpl implements PaymentServerRest {

    @Override
    @POST
    @Path("aja1/")
    public PaymentResponse aja1(Customer customer) {
        if (customer.getContactInfo() instanceof Address) {
            System.out.println("aja Address");
        } else if (customer.getContactInfo() instanceof PhoneNumber) {
            System.out.println("aja PhoneNumber");
        }
        return null;
    }

}

client web service

import packagename.payment.server.PaymentServerRest;
import packagename.payment.Customer;
import packagename.payment.Payment;
import packagename.payment.PaymentResponse;

public class PaymentClientRest  {

    private static PaymentServerRest server = createClientServer(PaymentServerRest.class, "paymentrest/");

    public static PaymentResponse aja1(Customer customer) {
        try {
            return server.aja1(customer);
        } catch (Exception e) {
            return null;
        }

    }


}

test case

import org.junit.Test;

import packagename.payment.Address;
import packagename.payment.Customer;
import packagename.payment.Payment;

public class PaymentClientRestTest {



    @Test
    public void testAja1() {
        Customer customer = new Customer();
        customer.setContactInfo(new Address());

        System.out.println(PaymentClientRest.aja1(customer));

        customer = new Customer();
        customer.setContactInfo(new PhoneNumber());

        System.out.println(PaymentClientRest.aja1(customer));


    }


}

spring configuration beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/jaxrs
        http://cxf.apache.org/schemas/jaxrs.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util.xsd">
    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <!-- <import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" /> -->
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <util:map id="jsonNamespaceMap" map-class="java.util.Hashtable">
        <entry key="http://localhost:8080/servicepath/paymentrest" value="payments"/>
       </util:map>



    <bean id="jsonMoxyProvider" class="org.eclipse.persistence.jaxb.rs.MOXyJsonProvider">
        <property name="attributePrefix" value="@" />
        <property name="formattedOutput" value="true" />
        <property name="includeRoot" value="true" />
        <property name="marshalEmptyCollections" value="false" />
        <property name="valueWrapper" value="$" />
        <!-- property name="namespaceSeparator" value="" /--> <!-- by default is point -->
        <property name="namespacePrefixMapper" ref="jsonNamespaceMap" />
    </bean>

     <!-- Payment RestFul service -->
    <jaxrs:server id="paymentrest" address="/paymentrest">
        <jaxrs:serviceBeans>
            <ref bean="paymentServerRest" />
        </jaxrs:serviceBeans>
        <jaxrs:providers>
            <ref bean="jsonMoxyProvider"/>
        </jaxrs:providers>
    </jaxrs:server>

    <bean id="paymentServerRest"
        class="packagename.payment.server.impl.PaymentServerRestImpl" />



</beans>

exception

16:29:27.098 [Main Thread] ERROR o.a.cxf.jaxrs.client.AbstractClient - .Problem with writing the request message, class : class packagename.payment.Customer, ContentType : application/json.
org.apache.cxf.jaxrs.client.ClientWebApplicationException: org.apache.cxf.interceptor.Fault: .Problem with writing the request message, class : class packagename.payment.Customer, ContentType : application/json.
    at org.apache.cxf.jaxrs.client.AbstractClient.checkClientException(AbstractClient.java:501)
    at org.apache.cxf.jaxrs.client.AbstractClient.preProcessResult(AbstractClient.java:488)
    at org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:531)
    at org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:205)
    at $Proxy13.aja1(Unknown Source)
    packagename.payment.client.PaymentClientRest.aja1(PaymentClientRest.java:61)
    packagename.payment.client.PaymentClientRestTest.testAja1(PaymentClientRestTest.java:100)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:21)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:232)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:61)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:223)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:684)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.cxf.interceptor.Fault: .Problem with writing the request message, class : class packagename.payment.Customer, ContentType : application/json.
    at org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.handleMessage(ClientProxyImpl.java:649)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
    at org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:526)
    ... 27 more
Caused by: org.apache.cxf.jaxrs.client.ClientWebApplicationException: .Problem with writing the request message, class : class packagename.payment.Customer, ContentType : application/json.
    at org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:611)
    at org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:406)
    at org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.handleMessage(ClientProxyImpl.java:640)
    ... 29 more
**Caused by: javax.ws.rs.WebApplicationException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Invalid @XmlElementRef : Type "class packagename.payment.ContactInfo" or any of its subclasses are not known to this context.
    this problem is related to the following location:
        at public packagename.payment.ContactInfo packagename.payment.Customer.getContactInfo()
        at packagename.payment.Customer**

    at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.handleExceptionEnd(AbstractJAXBProvider.java:585)
    at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.handleJAXBException(AbstractJAXBProvider.java:597)
    at org.apache.cxf.jaxrs.provider.json.JSONProvider.writeTo(JSONProvider.java:361)
    at org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
    ... 30 more
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Invalid @XmlElementRef : Type "class packagename.payment.ContactInfo" or any of its subclasses are not known to this context.
    this problem is related to the following location:
        at public packagename.payment.ContactInfo packagename.payment.Customer.getContactInfo()
        at packagename.payment.Customer

    at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:106)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:466)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:298)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:141)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1163)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:145)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:203)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:363)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.getClassContext(AbstractJAXBProvider.java:425)
    at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.getJAXBContext(AbstractJAXBProvider.java:409)
    at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.createMarshaller(AbstractJAXBProvider.java:510)
    at org.apache.cxf.jaxrs.provider.json.JSONProvider.marshal(JSONProvider.java:508)
    at org.apache.cxf.jaxrs.provider.json.JSONProvider.writeTo(JSONProvider.java:357)
    ... 31 more
bdoughan
  • 147,609
  • 23
  • 300
  • 400
sjdms265
  • 157
  • 2
  • 9

1 Answers1

1

Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.

I will help you work through this issue.

JSON Provider

The first issue is that it appears as though MOXyJsonProvider is not being picked up and CXF is defaulting to a default JAXB based JSON binding. This is resulting in a JAXB Ri exception being thrown.

Caused by: javax.ws.rs.WebApplicationException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions Invalid @XmlElementRef : Type "class packagename.payment.ContactInfo" or any of its subclasses are not known to this context. this problem is related to the following location: at public packagename.payment.ContactInfo packagename.payment.Customer.getContactInfo() at packagename.payment.Customer

at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.handleExceptionEnd(AbstractJAXBProvider.java:585)
at org.apache.cxf.jaxrs.provider.AbstractJAXBProvider.handleJAXBException(AbstractJAXBProvider.java:597)
at org.apache.cxf.jaxrs.provider.json.JSONProvider.writeTo(JSONProvider.java:361)
at org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
... 30 more

Subclasses

You need to let MOXy know about the subclasses. One way to do this is through the @XmlSeeAlso annotation.

@XmlSeeAlso({PhoneNumber.class, Address.class})
public abstract class ContactInfo {

}

UPDATE

I checked in a fix to MOXyJsonProvider in the EclipseLink 2.4.2 and 2.5.0 streams to fix a problem when running in RESTEasy. This may or may not be related to the issue you are seeing with CXF. The fix will be available in the nightly builds starting February 22, 2013 from the following location:

bdoughan
  • 147,609
  • 23
  • 300
  • 400
  • 1
    hi Blaise, thanks by the answer, i tried with @XmlSeeAlso({PhoneNumber.class, Address.class}) and didn't work, i'll try again with the nigthly version and give you a feed back when i have the result of my test. Thanks by your time – sjdms265 Mar 05 '13 at 20:47