Thanks Sergey. Your comment helped a lot.

But I am having issues in managing derived objects with namespace.
This is the test case.


    @Test
    public void testWriteReadDerivedNamespace() throws Exception {
        JSONProvider<Base1> provider = new JSONProvider<Base1>();
        provider.setMarshallAsJaxbElement(true);
        provider.setUnmarshallAsJaxbElement(true);
        Map<String, String> namespaceMap = new HashMap<String, String>();
        namespaceMap.put("http://derivedtest";, "derivedtestnamespace");
        provider.setNamespaceMap(namespaceMap);

        List<String> classnames = new ArrayList<String>();
        classnames.add(Base1.class.getName());
        classnames.add(Derived1.class.getName());
        provider.setJaxbElementClassNames(classnames);

        Map<String, String> jaxbEleClassMap = new HashMap<String, String>();
        jaxbEleClassMap.put(Base1.class.getName(), "{http://derivedtest
}bas");
        jaxbEleClassMap.put(Derived1.class.getName(), "{http://derivedtest
}der1");
        provider.setJaxbElementClassMap(jaxbEleClassMap);

        Base1 b = new Derived1("base", "derived");

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        provider.writeTo(b, Base1.class, Base1.class,
                       new Annotation[0], MediaType.APPLICATION_JSON_TYPE,
new MetadataMap<String, Object>(), bos);
        readBase(bos.toString());
    }

    private void readBase(String data) throws Exception {
        JSONProvider<Base1> provider = new JSONProvider<Base1>();
        provider.setMarshallAsJaxbElement(true);
        provider.setUnmarshallAsJaxbElement(true);
        Map<String, String> namespaceMap = new HashMap<String, String>();
        namespaceMap.put("http://derivedtest";, "derivedtestnamespace");
        provider.setNamespaceMap(namespaceMap);

        List<String> classnames = new ArrayList<String>();
        classnames.add(Base1.class.getName());
        classnames.add(Derived1.class.getName());
        provider.setJaxbElementClassNames(classnames);

        Map<String, String> jaxbEleClassMap = new HashMap<String, String>();
        jaxbEleClassMap.put(Base1.class.getName(), "{http://derivedtest
}basenamespace");
        jaxbEleClassMap.put(Derived1.class.getName(), "{http://derivedtest
}dernamespace");
        provider.setJaxbElementClassMap(jaxbEleClassMap);

        ByteArrayInputStream is = new ByteArrayInputStream(data.getBytes());

        Base1 base = provider.readFrom(
                       Base1.class, Base1.class,
                       new Annotation[0], MediaType.APPLICATION_JSON_TYPE,
new MetadataMap<String, String>(), is);
        assertEquals("base", base.getBase1Field());
    }

The Bean class are:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Base1"
, namespace = "http://derivedtest";
)
@XmlSeeAlso({Derived1.class })
public class Base1 {

    protected String base1Field;

    Base1() { }

    Base1(String base) {
        base1Field = base;
    }

    public String getBase1Field() {
        return base1Field;
    }

    public void setBase1Field(String value) {
        this.base1Field = value;
    }
}


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Derived1"
, namespace = "http://derivedtest";
)
public class Derived1
    extends Base1 {

    protected String derived1Field;

    Derived1() { }
    public Derived1(String base, String derived) {
        super(base);
        derived1Field = derived;
    }

    public String getDerived1Field() {
        return derived1Field;
    }

    public void setDerived1Field(String value) {
        this.derived1Field = value;
    }

}



provider.writeTo serialize as follows.
{"derivedtestnamespace.bas":{"@xsi.type":"ns2
:Derived1","base1Field":"base","derived1Field":"derived"}}



During unmarsalling it is throwing the following exception:
javax.ws.rs.WebApplicationException:
java.lang.IllegalArgumentException:*prefix ns2 is not bound to a
namespace
*
at
org.apache.cxf.jaxrs.provider.json.JSONProvider.readFrom(JSONProvider.java:246)
at
org.apache.cxf.jaxrs.provider.json.JSONProviderTest.readBase(JSONProviderTest.java:149)
at
org.apache.cxf.jaxrs.provider.json.JSONProviderTest.testWriteReadDerivedNamespace(JSONProviderTest.java:126)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at
org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
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:683)
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: java.lang.IllegalArgumentException: prefix ns2 is not bound to a
namespace
at
com.sun.xml.bind.DatatypeConverterImpl._parseQName(DatatypeConverterImpl.java:385)
at
com.sun.xml.bind.v2.runtime.unmarshaller.XsiTypeLoader.parseXsiType(XsiTypeLoader.java:92)
at
com.sun.xml.bind.v2.runtime.unmarshaller.XsiTypeLoader.startElement(XsiTypeLoader.java:70)
at
com.sun.xml.bind.v2.runtime.unmarshaller.ProxyLoader.startElement(ProxyLoader.java:55)
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:481)
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459)
at
com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:71)
at
com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:242)
at
com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:176)
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:360)
at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:339)
at
org.apache.cxf.jaxrs.provider.json.JSONProvider.readFrom(JSONProvider.java:222)
... 25 more





I don't how namespace ns2 jumps in.
Please help.


Thanks,
Govind



On Fri, May 4, 2012 at 7:55 PM, Sergey Beryozkin <[email protected]>wrote:

> Hi
>
> On 04/05/12 10:52, Govindaram PS wrote:
>
>> When the json data includes namespace, marshalling to json string and
>> unmarshling the same string is failing.
>> The test case to verify is below. This test case can be directly executed
>> in cxf/rt/frontend/jaxrs/src/**test/java/org/apache/cxf/**jaxrs/provider/
>> **JSONProviderTest.java
>> let me know if anything wrong in this test case.
>>
>>
> Base1 class has no XMLRootElement annotation, so the following applies:
> http://cxf.apache.org/docs/**jax-rs-data-bindings.html#JAX-**
> RSDataBindings-**HandlingJAXBbeanswithoutXmlRoo**tElementannotations<http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-HandlingJAXBbeanswithoutXmlRootElementannotations>
> ,
>
> I used marshallAsJaxbElement and unmarshallAsJaxbElement properties
> instead, but the class map property can do too
>
> Cheers, Sergey
>
>
>
>
>
>>
>>     @Test
>>     public void testWriteReadNamespace() throws Exception {
>>         JSONProvider<Base1>  provider = new JSONProvider<Base1>();
>>         Map<String, String>  namespaceMap = new HashMap<String, String>();
>>         namespaceMap.put("http://**derivedtest <http://derivedtest>",
>> "ns1");
>>         provider.setNamespaceMap(**namespaceMap);
>>         List<String>  classnames = new ArrayList<String>();
>>         classnames.add(Base1.class.**getName());
>>         provider.**setJaxbElementClassNames(**classnames);
>>         Base1 b = new Base1("base");
>>
>>         ByteArrayOutputStream bos = new ByteArrayOutputStream();
>>         provider.writeTo(b, Base1.class, Base1.class,
>>                        new Annotation[0], MediaType.APPLICATION_JSON_**
>> TYPE,
>> new MetadataMap<String, Object>(), bos);
>>         readBase(bos.toString());
>>     }
>>
>>     private void readBase(String data) throws Exception {
>>         JSONProvider<Base1>  provider = new JSONProvider<Base1>();
>>         Map<String, String>  namespaceMap = new HashMap<String, String>();
>>         namespaceMap.put("http://**derivedtest <http://derivedtest>",
>> "ns1");
>>         provider.setNamespaceMap(**namespaceMap);
>>         List<String>  classnames = new ArrayList<String>();
>>         classnames.add(Base1.class.**getName());
>>         provider.**setJaxbElementClassNames(**classnames);
>>         ByteArrayInputStream is = new ByteArrayInputStream(data.**
>> getBytes());
>>         Base1 base = provider.readFrom(
>>                        Base1.class, Base1.class,
>>                        new Annotation[0], MediaType.APPLICATION_JSON_**
>> TYPE,
>> new MetadataMap<String, String>(), is);
>>         assertEquals("base", base.getBase1Field());
>>     }
>>
>>     @XmlAccessorType(**XmlAccessType.FIELD)
>>     @XmlType(name = "Base1", namespace = "http://derivedtest";)
>>     public static class Base1 {
>>
>>         protected String base1Field;
>>
>>         Base1() { }
>>
>>         Base1(String base) {
>>             base1Field = base;
>>         }
>>
>>         public String getBase1Field() {
>>             return base1Field;
>>         }
>>
>>         public void setBase1Field(String value) {
>>             this.base1Field = value;
>>         }
>>     }
>>
>>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/
>
> Blog: http://sberyozkin.blogspot.com
>

Reply via email to