cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: wadl missing jaxb method parameters and return data types
Date Fri, 11 May 2012 13:09:16 GMT
As it happens the code I copied from the CXF JAXB DataBinding to do with 
managing schemas with the empty namespaces and then modified was broken, 
so I fixed that.

The code in the CXF Data Bindings is much more involved but for now I'm 
assuming that we have simple cases like the typical root resource with 
manually created JAXB classes, no Objectfactory, etc...We can extend the 
relevant code if ever needed.

I also fixed an issue with WADLGenerator not linking in case of 
XMLRootElement missing a name attribute

Cheers, Sergey

On 11/05/12 12:12, Sergey Beryozkin wrote:
> I reproduced it.
> Basically what happens is that the below TestCompositeObject gets
> represented by two schemas in the grammar section:
>
> <xs:schema attributeFormDefault="unqualified"
> elementFormDefault="unqualified">
>
> <xs:complexType name="testCompositeObject">
> <xs:sequence>
> <xs:element name="id" type="xs:int"/>
> <xs:element minOccurs="0" name="name" type="xs:string"/> </xs:sequence>
> </xs:complexType>
>
> </xs:schema>
>
> <xs:schema attributeFormDefault="unqualified"
> elementFormDefault="unqualified"
> targetNamespace="http://example.com/test">
>
> <xs:import/>
>
> <xs:element name="test" type="testCompositeObject"/>
> </xs:schema>
>
>
> Both scheme representations are accepted before the compilation but the
> compiler is not 'willing' to resolve the references to types residing in
> the schema without a target namespace.
>
> I've no idea at the moment how to deal with it.
> Additionally adding @XmlType(name = "testType", namespace =
> "http://example.com/test") fixes the multi-schema generation, which I
> guess is the case when JAXB classes have been generated from the
> existing schemas, but I guess it should be somehow possible either
> customize the schema generation in the WADLGenerator to get a single
> schema produced or tweak the schema compiler to process the above two
> schemas, something to figure out...
>
> Sergey
>
>
>
> On 10/05/12 23:34, Ted wrote:
>> I'd actually tried that when I added the namespace too, it didn't help
>> so I
>> didn't mention it before. I just tried it again with similar results, the
>> parameter is still missing although the wadl is slightly different due to
>> the name now :
>>
>> @XmlRootElement(name = "TestCompositeObject", namespace = "
>> http://example.com/test")
>> public static class TestCompositeObject
>> {
>> public int id = 23;
>> public String name = "asdf";
>> }
>>
>> wadl produces :
>>
>> <resource path="/setTest3">
>> <method name="PUT" id="setTest3">
>> <request>
>> <representation mediaType="application/xml"
>> element="prefix1:TestCompositeObject"/>
>> </request>
>> <response>
>> <representation mediaType="application/xml"
>> element="prefix1:TestCompositeObject"/>
>> </response>
>> </method>
>> </resource>
>>
>> The exception on wadl2java generation is still similar :
>>
>> [java] WADLToJava Error: java.lang.reflect.UndeclaredThrowableException
>> [java]
>> [java] org.apache.cxf.tools.common.ToolException:
>> java.lang.reflect.UndeclaredThrowableException
>> [java] at
>> org.apache.cxf.tools.wadlto.jaxrs.JAXRSContainer.execute(JAXRSContainer.java:82)
>>
>> [java] at
>> org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:103)
>>
>> [java] at
>> org.apache.cxf.tools.wadlto.WADLToJava.run(WADLToJava.java:65)
>> [java] at
>> org.apache.cxf.tools.wadlto.WADLToJava.run(WADLToJava.java:57)
>> [java] at
>> org.apache.cxf.tools.wadlto.WADLToJava.main(WADLToJava.java:99)
>> [java] Caused by: java.lang.reflect.UndeclaredThrowableException
>> [java] at $Proxy9.bind(Unknown Source)
>> [java] at
>> org.apache.cxf.tools.wadlto.jaxrs.SourceGenerator.createCodeModel(SourceGenerator.java:1196)
>>
>> [java] at
>> org.apache.cxf.tools.wadlto.jaxrs.SourceGenerator.generateSchemaCodeAndInfo(SourceGenerator.java:231)
>>
>> [java] at
>> org.apache.cxf.tools.wadlto.jaxrs.SourceGenerator.generateSource(SourceGenerator.java:220)
>>
>> [java] at
>> org.apache.cxf.tools.wadlto.jaxrs.JAXRSContainer.processWadl(JAXRSContainer.java:151)
>>
>> [java] at
>> org.apache.cxf.tools.wadlto.jaxrs.JAXRSContainer.execute(JAXRSContainer.java:65)
>>
>> [java] at
>> org.apache.cxf.tools.wadlto.jaxrs.JAXRSContainer.execute(JAXRSContainer.java:74)
>>
>> [java] ... 4 more
>> [java] Caused by: java.lang.reflect.InvocationTargetException
>> [java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
>> Method)
>> [java] at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>
>> [java] at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>
>> [java] at java.lang.reflect.Method.invoke(Method.java:597)
>> [java] at
>> org.apache.cxf.common.util.ReflectionInvokationHandler.invoke(ReflectionInvokationHandler.java:52)
>>
>> [java] ... 11 more
>> [java] Caused by: java.lang.reflect.UndeclaredThrowableException
>> [java] at $Proxy13.error(Unknown Source)
>> [java] at
>> com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.error(SchemaCompilerImpl.java:316)
>>
>> [java] at
>> com.sun.tools.xjc.util.ErrorReceiverFilter.error(ErrorReceiverFilter.java:82)
>>
>> [java] at
>> com.sun.xml.xsom.impl.parser.ParserContext$2.error(ParserContext.java:206)
>>
>> [java] at
>> com.sun.xml.xsom.impl.parser.ParserContext$1.reportError(ParserContext.java:184)
>>
>> [java] at
>> com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.reportError(NGCCRuntimeEx.java:175)
>>
>> [java] at
>> com.sun.xml.xsom.impl.parser.DelayedRef.resolve(DelayedRef.java:110)
>> [java] at
>> com.sun.xml.xsom.impl.parser.DelayedRef.run(DelayedRef.java:85)
>> [java] at
>> com.sun.xml.xsom.impl.parser.ParserContext.getResult(ParserContext.java:135)
>>
>> [java] at
>> com.sun.xml.xsom.parser.XSOMParser.getResult(XSOMParser.java:211)
>> [java] at
>> com.sun.tools.xjc.ModelLoader.createXSOM(ModelLoader.java:532)
>> [java] at
>> com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:268)
>>
>> [java] ... 16 more
>> [java] Caused by: java.lang.reflect.InvocationTargetException
>> [java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
>> Method)
>> [java] at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>
>> [java] at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>
>> [java] at java.lang.reflect.Method.invoke(Method.java:597)
>> [java] at
>> org.apache.cxf.common.util.ReflectionInvokationHandler.invoke(ReflectionInvokationHandler.java:52)
>>
>> [java] ... 28 more
>> [java] Caused by: java.lang.RuntimeException: Error compiling schema
>> from WADL : undefined simple or complex type 'testCompositeObject'
>> [java] at
>> org.apache.cxf.tools.wadlto.jaxrs.SourceGenerator$InnerErrorListener.error(SourceGenerator.java:1343)
>>
>> [java] ... 33 more
>> [java] Caused by: org.xml.sax.SAXParseException: undefined simple or
>> complex type 'testCompositeObject'
>> [java] at
>> com.sun.xml.xsom.impl.parser.ParserContext$1.reportError(ParserContext.java:180)
>>
>> [java] ... 23 more
>>
>>
>> On Fri, May 11, 2012 at 7:38 AM, Sergey
>> Beryozkin<sberyozkin@gmail.com>wrote:
>>
>>> Well, it is the second time I'm seeing XmlRootElement with a namespace
>>> attribute but without a name attribute, and in both cases the same
>>> issue of
>>> the badly generated WADL has been discussed :-), so it is time to
>>> support
>>> this variation too.
>>>
>>> Yes, the JAXB Data Binding section does not show a namespace
>>> attribute in
>>> action, it is not that important for that section, besides using this
>>> attribute is not the only way to provide a namespace for JAXB.
>>>
>>> I think an empty XMLRootElement works OK when ObjectFactory is also
>>> available...
>>> In meantime, add an explicit name attribute too
>>>
>>> Cheers, Sergey
>>>
>>>
>>>
>>> On 10/05/12 21:20, Ted wrote:
>>>
>>>> None of the examples I've seen have had to do that. Even the "basic"
>>>> sample
>>>> in cxf doesn't seem to do that. If I look at the sample
>>>> Customer/Order/Product classes none of them have an explicit namespace
>>>> declaration.
>>>>
>>>> I gave it a try anyways :
>>>>
>>>> @XmlRootElement(namespace = "http://example.com/test")
>>>> public static class TestCompositeObject
>>>> {
>>>> public int id = 23;
>>>> public String name = "asdf";
>>>> }
>>>>
>>>> I can see wadl has changed to have the namespace for the
>>>> TestCompositeObject entry. The method itself though has not changed :
>>>>
>>>> <resource path="/setTest3">
>>>> <method name="PUT" id="setTest3">
>>>> <request>
>>>> <representation mediaType="application/xml"/>
>>>> </request>
>>>> <response>
>>>> <representation mediaType="application/xml"/>
>>>> </response>
>>>> </method>
>>>> </resource>
>>>>
>>>> When I call wadl2java on it, I get an exception : (I'm using jdk
>>>> 1.6.0_26-b03 on linux, and cxf 2.6.0)
>>>>
>>>> [java] WADLToJava Error: java.lang.reflect.**
>>>> UndeclaredThrowableException
>>>> [java]
>>>> [java] org.apache.cxf.tools.common.**ToolException:
>>>> java.lang.reflect.**UndeclaredThrowableException
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**jaxrs.JAXRSContainer.execute(**
>>>> JAXRSContainer.java:82)
>>>> [java] at
>>>> org.apache.cxf.tools.common.**toolspec.ToolRunner.runTool(**
>>>> ToolRunner.java:103)
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**WADLToJava.run(WADLToJava.**java:65)
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**WADLToJava.run(WADLToJava.**java:57)
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**WADLToJava.main(WADLToJava.**java:99)
>>>> [java] Caused by: java.lang.reflect.**UndeclaredThrowableException
>>>> [java] at $Proxy9.bind(Unknown Source)
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**jaxrs.SourceGenerator.**createCodeModel(**
>>>>
>>>> SourceGenerator.java:1196)
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**jaxrs.SourceGenerator.**
>>>> generateSchemaCodeAndInfo(**SourceGenerator.java:231)
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**jaxrs.SourceGenerator.**generateSource(**
>>>> SourceGenerator.java:220)
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**jaxrs.JAXRSContainer.**
>>>> processWadl(JAXRSContainer.**java:151)
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**jaxrs.JAXRSContainer.execute(**
>>>> JAXRSContainer.java:65)
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**jaxrs.JAXRSContainer.execute(**
>>>> JAXRSContainer.java:74)
>>>> [java] ... 4 more
>>>> [java] Caused by: java.lang.reflect.**InvocationTargetException
>>>> [java] at sun.reflect.**NativeMethodAccessorImpl.**
>>>> invoke0(Native
>>>> Method)
>>>> [java] at
>>>> sun.reflect.**NativeMethodAccessorImpl.**invoke(**
>>>> NativeMethodAccessorImpl.java:**39)
>>>> [java] at
>>>> sun.reflect.**DelegatingMethodAccessorImpl.**invoke(**
>>>> DelegatingMethodAccessorImpl.**java:25)
>>>> [java] at java.lang.reflect.Method.**invoke(Method.java:597)
>>>> [java] at
>>>> org.apache.cxf.common.util.**ReflectionInvokationHandler.**invoke(**
>>>> ReflectionInvokationHandler.**java:52)
>>>> [java] ... 11 more
>>>> [java] Caused by: java.lang.reflect.**UndeclaredThrowableException
>>>> [java] at $Proxy13.error(Unknown Source)
>>>> [java] at
>>>> com.sun.tools.xjc.api.impl.**s2j.SchemaCompilerImpl.error(**
>>>> SchemaCompilerImpl.java:316)
>>>> [java] at
>>>> com.sun.tools.xjc.util.**ErrorReceiverFilter.error(**
>>>> ErrorReceiverFilter.java:82)
>>>> [java] at
>>>> com.sun.xml.xsom.impl.parser.**ParserContext$2.error(**
>>>> ParserContext.java:206)
>>>> [java] at
>>>> com.sun.xml.xsom.impl.parser.**ParserContext$1.reportError(**
>>>> ParserContext.java:184)
>>>> [java] at
>>>> com.sun.xml.xsom.impl.parser.**NGCCRuntimeEx.reportError(**
>>>> NGCCRuntimeEx.java:175)
>>>> [java] at
>>>> com.sun.xml.xsom.impl.parser.**DelayedRef.resolve(DelayedRef.**java:110)
>>>>
>>>> [java] at
>>>> com.sun.xml.xsom.impl.parser.**DelayedRef.run(DelayedRef.**java:85)
>>>> [java] at co
>>>> [java]
>>>> m.sun.xml.xsom.impl.parser.**ParserContext.getResult(**
>>>> ParserContext.java:135)
>>>> [java] at
>>>> com.sun.xml.xsom.parser.**XSOMParser.getResult(**XSOMParser.java:211)
>>>> [java] at
>>>> com.sun.tools.xjc.ModelLoader.**createXSOM(ModelLoader.java:**532)
>>>> [java] at
>>>> com.sun.tools.xjc.api.impl.**s2j.SchemaCompilerImpl.bind(**
>>>> SchemaCompilerImpl.java:268)
>>>> [java] ... 16 more
>>>> [java] Caused by: java.lang.reflect.**InvocationTargetException
>>>> [java] at sun.reflect.**NativeMethodAccessorImpl.**
>>>> invoke0(Native
>>>> Method)
>>>> [java] at
>>>> sun.reflect.**NativeMethodAccessorImpl.**invoke(**
>>>> NativeMethodAccessorImpl.java:**39)
>>>> [java] at
>>>> sun.reflect.**DelegatingMethodAccessorImpl.**invoke(**
>>>> DelegatingMethodAccessorImpl.**java:25)
>>>> [java] at java.lang.reflect.Method.**invoke(Method.java:597)
>>>> [java] at
>>>> org.apache.cxf.common.util.**ReflectionInvokationHandler.**invoke(**
>>>> ReflectionInvokationHandler.**java:52)
>>>> [java] ... 28 more
>>>> [java] Caused by: java.lang.RuntimeException: Error compiling schema
>>>> from WADL : undefined simple or complex type 'testCompositeObject'
>>>> [java] at
>>>> org.apache.cxf.tools.wadlto.**jaxrs.SourceGenerator$**
>>>> InnerErrorListener.error(**SourceGenerator.java:1343)
>>>> [java] ... 33 more
>>>> [java] Caused by: org.xml.sax.SAXParseException: undefined simple or
>>>> complex type 'testCompositeObject'
>>>> [java] at
>>>> com.sun.xml.xsom.impl.parser.**ParserContext$1.reportError(**
>>>> ParserContext.java:180)
>>>> [java] ... 23 more
>>>>
>>>>
>>>> I should add though, if I just get the object like :
>>>>
>>>> @GET
>>>> @Path("setTest2")
>>>> @Produces("application/xml")
>>>> public TestCompositeObject getTest2()
>>>> {
>>>> return(new TestCompositeObject());
>>>> }
>>>>
>>>> It does return XML as a string like I expect it to.
>>>>
>>>>
>>>>
>>>> On Thu, May 10, 2012 at 7:15 PM, Sergey
>>>> Beryozkin<sberyozkin@gmail.com**
>>>>> wrote:
>>>>
>>>> Hi
>>>>>
>>>>> On 10/05/12 04:37, Ted wrote:
>>>>>
>>>>> thanks for the answer to my previous method Id problem, adding
>>>>>> addResourceAndMethodIds worked great.
>>>>>>
>>>>>> I have a new problem now, I'm trying to use the JAXB to automatically
>>>>>> convert parameters and response types to and from java/xml. The
>>>>>> method
>>>>>> parameter seems to be dissappearing, or I'm missing an annotation
or
>>>>>> something. All the examples I've seen and documentation seems to
show
>>>>>> that
>>>>>> it should work...
>>>>>>
>>>>>> My service has the following :
>>>>>>
>>>>>> @XmlRootElement
>>>>>> public static class TestCompositeObject
>>>>>> {
>>>>>> public int id = 23;
>>>>>> public String name = "asdf";
>>>>>> }
>>>>>>
>>>>>> @PUT
>>>>>> @Path("setTest3")
>>>>>> @Produces("application/xml")
>>>>>> @Consumes("application/xml")
>>>>>> public TestCompositeObject setTest3(TestCompositeObject transfer)
>>>>>> {
>>>>>> logger.info(transfer);
>>>>>> return(transfer);
>>>>>> }
>>>>>>
>>>>>> The wadl generated looks a little off, it's missing the params :
>>>>>>
>>>>>> <resource path="/setTest3">
>>>>>> <method name="PUT" id="setTest3">
>>>>>> <request>
>>>>>> <representation mediaType="application/xml" />
>>>>>> </request>
>>>>>> <response>
>>>>>> <representation mediaType="application/xml" />
>>>>>> </response>
>>>>>> </method>
>>>>>> </resource>
>>>>>>
>>>>>> As a result when I generate the stubs from the wadl, it comes out
not
>>>>>> quite
>>>>>> right :
>>>>>>
>>>>>> @PUT
>>>>>> @Consumes("application/xml")
>>>>>> @Produces("application/xml")
>>>>>> @Path("/setTest3")
>>>>>> Response setTest3();
>>>>>>
>>>>>> There's no method parameter, and I'm not quite sure if Response
>>>>>> should
>>>>>> be
>>>>>> the return type of if it should have been mapped back to
>>>>>> TestCompositeObject.
>>>>>>
>>>>>> I can't seem to find any documentation on any annotations or any
>>>>>> configuration to sort this out.
>>>>>>
>>>>>>
>>>>>> The explanation is that TestCompositeObject has no any namespace
>>>>>> bound
>>>>> to
>>>>> it, please add a namespace attribute to XMlRootElement and you
>>>>> should get
>>>>> the grammar and links properly generated
>>>>>
>>>>> HTH
>>>>> Sergey
>>>>>
>>>>>
>>>>> Anyone have any ideas?
>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>> Sergey Beryozkin
>>>>>
>>>>> Talend Community Coders
>>>>> http://coders.talend.com/
>>>>>
>>>>> Blog: http://sberyozkin.blogspot.com
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>> --
>>> Sergey Beryozkin
>>>
>>> Talend Community Coders
>>> http://coders.talend.com/
>>>
>>> Blog: http://sberyozkin.blogspot.com
>>>
>>
>>
>>
>
>


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Mime
View raw message