You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by "J. Fiala" <mo...@fwd.at> on 2016/08/17 16:40:49 UTC
Spring Boot CXF JAX-RS and Jackson Provider
I try to run a CXF JAX-RS endpoint using Spring XML configuration and
Spring Boot.
The services are listed correctly when I access the server and the
WADL/Swagger endpoint is generated correctly:
http://localhost:8080/services/
The API methods are annoted with:
@Consumes("application/json")
@Produces("application/json")
However, when I invoke any service using Json, I get:
|JAXBException occurred : unable to marshal type "..." as an element
because it is missing an @XmlRootElement annotation. unable to marshal
type "..." as an element because it is missing an @XmlRootElement
annotation. |
I'm using wadl2java to generate the api and model classes at server side
from the WADL, so there are @XmlAccessorType/@XmlType annotation in my
model classes on the server side.
Spring-Boot/CXF seems ignore the provider configured in the Spring
configuration XML (which is working perfectly if deployed without Spring
Boot to e.g. Jboss/Tomcat):
<bean id="jsonProvider"
class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
How can I set the JacksonJsonProvider to be used by Spring Boot/CXF, or
are model classes annotated with @Xml... not supported for Spring Boot/CXF?
Best regards,
Johannes
Re: Spring Boot CXF JAX-RS and Jackson Provider
Posted by "J. Fiala" <mo...@fwd.at>.
Hi,
Thank you, that did it, jettison was on the classpath - I removed it and
now it works like a charm :).
So CXF Spring Boot also works with the Spring XML configuration, no need
to specify Jackson separately ( I already specified and associated it in
the Spring XML configuration).
This way I'm using Spring Boot in a maven profile as embedded server and
deploy to Tomcat/Jboss - perfect!
Maybe you can add this hint to the docs (to search for jettison on the
classpath if the marshalling exceptions occur...)?
Best regards,
Johannes
Am 18.08.2016 um 00:25 schrieb Sergey Beryozkin:
> Hi
>
> Oh, I thought SpringBoot made XML config a history :-)
>
> I'll need to document it at CXF SpringBoot wiki page.
>
> Can you give me a favor and double check that you have no Jettison
> library somewhere on the classpath ? If it is available then CXF will
> auto-create its own CXF JSONProvider which is more specific than
> Jackson (FYI it has wildcard Consumes/Produces which makes it less
> specific compared to other provider candidates)
>
> Cheers, Sergey
>
> On 17/08/16 18:02, J. Fiala wrote:
>> Sergey,
>>
>> Thank you for the quick response!
>>
>> I'm using cxf-spring-boot-starter-jaxrs 3.1.7 with Spring Boot
>> 1.3.3.RELEASE.
>>
>> You only have to add the XML using @ImportResource, then it is working
>> immediately:
>>
>> @ImportResource({"classpath:/mySpringContext.xml"})
>> @EnableAutoConfiguration
>> public class Application extends SpringBootServletInitializer {
>>
>> @Override
>> protected SpringApplicationBuilder
>> configure(SpringApplicationBuilder application) {
>> return application.sources(Application.class);
>> }
>>
>> public static void main(String[] args) {
>> SpringApplication.run(Application.class, args);
>> }
>>
>>
>> }
>>
>> We have lots of existing spring XML configurations so we like to reuse
>> them.
>>
>> Inside the XML configuration the JacksonProvider is declared and
>> connected to the endpoints:
>>
>> <bean id="jsonProvider"
>> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
>>
>> <jaxrs:server id="restServer" address="/myservice">
>> <jaxrs:serviceBeans>
>> <ref bean="myController" />
>> </jaxrs:serviceBeans>
>> <jaxrs:providers>
>> <ref bean="jsonProvider" />
>> <ref bean="wadlGenerator" />
>> </jaxrs:providers>
>> <jaxrs:features>
>> <ref bean="swagger2Feature" />
>> </jaxrs:features>
>> </jaxrs:server>
>>
>> So the Jackson Provider should be picked up when the Spring
>> configuration is used by the Spring Boot starter.
>>
>> In fact, I think the @Xml..-annotations in the model classes are causing
>> the issue (generated using wadl2java).
>> If you like, I can provide a sample using wadl2java generated classes
>> based on your sample (spring_boot_scan) and try to reproduce the issue.
>>
>> Best regards,
>> Johannes
>>
>>
>> Am 17.08.2016 um 18:52 schrieb Sergey Beryozkin:
>>> Hi
>>>
>>> To be honest I'm not sure traditional Spring XML configuration files
>>> are even supported with Spring Boot ? (XML is the old citizen,
>>> properties is the new citizen :-)), but if it is then let me know how.
>>>
>>> Are you using CXF 3.1.7 Spring Boot starter ?
>>>
>>> I think you need to have a @Bean method returning
>>> new JacksonJsonProvider()
>>>
>>> It can also be auto-scanned - but I found in my experiments that
>>> muiltiple Jackson providers can be picked up, so I'd rather return an
>>> instance from the code
>>>
>>> Sergey
>>> On 17/08/16 17:40, J. Fiala wrote:
>>>> I try to run a CXF JAX-RS endpoint using Spring XML configuration and
>>>> Spring Boot.
>>>>
>>>> The services are listed correctly when I access the server and the
>>>> WADL/Swagger endpoint is generated correctly:
>>>>
>>>> http://localhost:8080/services/
>>>>
>>>> The API methods are annoted with:
>>>> @Consumes("application/json")
>>>> @Produces("application/json")
>>>>
>>>> However, when I invoke any service using Json, I get:
>>>>
>>>> |JAXBException occurred : unable to marshal type "..." as an element
>>>> because it is missing an @XmlRootElement annotation. unable to marshal
>>>> type "..." as an element because it is missing an @XmlRootElement
>>>> annotation. |
>>>>
>>>> I'm using wadl2java to generate the api and model classes at server
>>>> side
>>>> from the WADL, so there are @XmlAccessorType/@XmlType annotation in my
>>>> model classes on the server side.
>>>>
>>>> Spring-Boot/CXF seems ignore the provider configured in the Spring
>>>> configuration XML (which is working perfectly if deployed without
>>>> Spring
>>>> Boot to e.g. Jboss/Tomcat):
>>>> <bean id="jsonProvider"
>>>> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
>>>>
>>>> How can I set the JacksonJsonProvider to be used by Spring
>>>> Boot/CXF, or
>>>> are model classes annotated with @Xml... not supported for Spring
>>>> Boot/CXF?
>>>>
>>>> Best regards,
>>>> Johannes
>>>>
>>>>
>>>
>>>
>>
>
>
Re: Spring Boot CXF JAX-RS and Jackson Provider
Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
Oh, I thought SpringBoot made XML config a history :-)
I'll need to document it at CXF SpringBoot wiki page.
Can you give me a favor and double check that you have no Jettison
library somewhere on the classpath ? If it is available then CXF will
auto-create its own CXF JSONProvider which is more specific than Jackson
(FYI it has wildcard Consumes/Produces which makes it less specific
compared to other provider candidates)
Cheers, Sergey
On 17/08/16 18:02, J. Fiala wrote:
> Sergey,
>
> Thank you for the quick response!
>
> I'm using cxf-spring-boot-starter-jaxrs 3.1.7 with Spring Boot
> 1.3.3.RELEASE.
>
> You only have to add the XML using @ImportResource, then it is working
> immediately:
>
> @ImportResource({"classpath:/mySpringContext.xml"})
> @EnableAutoConfiguration
> public class Application extends SpringBootServletInitializer {
>
> @Override
> protected SpringApplicationBuilder
> configure(SpringApplicationBuilder application) {
> return application.sources(Application.class);
> }
>
> public static void main(String[] args) {
> SpringApplication.run(Application.class, args);
> }
>
>
> }
>
> We have lots of existing spring XML configurations so we like to reuse
> them.
>
> Inside the XML configuration the JacksonProvider is declared and
> connected to the endpoints:
>
> <bean id="jsonProvider"
> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
>
> <jaxrs:server id="restServer" address="/myservice">
> <jaxrs:serviceBeans>
> <ref bean="myController" />
> </jaxrs:serviceBeans>
> <jaxrs:providers>
> <ref bean="jsonProvider" />
> <ref bean="wadlGenerator" />
> </jaxrs:providers>
> <jaxrs:features>
> <ref bean="swagger2Feature" />
> </jaxrs:features>
> </jaxrs:server>
>
> So the Jackson Provider should be picked up when the Spring
> configuration is used by the Spring Boot starter.
>
> In fact, I think the @Xml..-annotations in the model classes are causing
> the issue (generated using wadl2java).
> If you like, I can provide a sample using wadl2java generated classes
> based on your sample (spring_boot_scan) and try to reproduce the issue.
>
> Best regards,
> Johannes
>
>
> Am 17.08.2016 um 18:52 schrieb Sergey Beryozkin:
>> Hi
>>
>> To be honest I'm not sure traditional Spring XML configuration files
>> are even supported with Spring Boot ? (XML is the old citizen,
>> properties is the new citizen :-)), but if it is then let me know how.
>>
>> Are you using CXF 3.1.7 Spring Boot starter ?
>>
>> I think you need to have a @Bean method returning
>> new JacksonJsonProvider()
>>
>> It can also be auto-scanned - but I found in my experiments that
>> muiltiple Jackson providers can be picked up, so I'd rather return an
>> instance from the code
>>
>> Sergey
>> On 17/08/16 17:40, J. Fiala wrote:
>>> I try to run a CXF JAX-RS endpoint using Spring XML configuration and
>>> Spring Boot.
>>>
>>> The services are listed correctly when I access the server and the
>>> WADL/Swagger endpoint is generated correctly:
>>>
>>> http://localhost:8080/services/
>>>
>>> The API methods are annoted with:
>>> @Consumes("application/json")
>>> @Produces("application/json")
>>>
>>> However, when I invoke any service using Json, I get:
>>>
>>> |JAXBException occurred : unable to marshal type "..." as an element
>>> because it is missing an @XmlRootElement annotation. unable to marshal
>>> type "..." as an element because it is missing an @XmlRootElement
>>> annotation. |
>>>
>>> I'm using wadl2java to generate the api and model classes at server side
>>> from the WADL, so there are @XmlAccessorType/@XmlType annotation in my
>>> model classes on the server side.
>>>
>>> Spring-Boot/CXF seems ignore the provider configured in the Spring
>>> configuration XML (which is working perfectly if deployed without Spring
>>> Boot to e.g. Jboss/Tomcat):
>>> <bean id="jsonProvider"
>>> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
>>>
>>> How can I set the JacksonJsonProvider to be used by Spring Boot/CXF, or
>>> are model classes annotated with @Xml... not supported for Spring
>>> Boot/CXF?
>>>
>>> Best regards,
>>> Johannes
>>>
>>>
>>
>>
>
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/
Re: Spring Boot CXF JAX-RS and Jackson Provider
Posted by "J. Fiala" <mo...@fwd.at>.
Sergey,
Thank you for the quick response!
I'm using cxf-spring-boot-starter-jaxrs 3.1.7 with Spring Boot
1.3.3.RELEASE.
You only have to add the XML using @ImportResource, then it is working
immediately:
@ImportResource({"classpath:/mySpringContext.xml"})
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder
configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
We have lots of existing spring XML configurations so we like to reuse them.
Inside the XML configuration the JacksonProvider is declared and
connected to the endpoints:
<bean id="jsonProvider"
class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
<jaxrs:server id="restServer" address="/myservice">
<jaxrs:serviceBeans>
<ref bean="myController" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider" />
<ref bean="wadlGenerator" />
</jaxrs:providers>
<jaxrs:features>
<ref bean="swagger2Feature" />
</jaxrs:features>
</jaxrs:server>
So the Jackson Provider should be picked up when the Spring
configuration is used by the Spring Boot starter.
In fact, I think the @Xml..-annotations in the model classes are causing
the issue (generated using wadl2java).
If you like, I can provide a sample using wadl2java generated classes
based on your sample (spring_boot_scan) and try to reproduce the issue.
Best regards,
Johannes
Am 17.08.2016 um 18:52 schrieb Sergey Beryozkin:
> Hi
>
> To be honest I'm not sure traditional Spring XML configuration files
> are even supported with Spring Boot ? (XML is the old citizen,
> properties is the new citizen :-)), but if it is then let me know how.
>
> Are you using CXF 3.1.7 Spring Boot starter ?
>
> I think you need to have a @Bean method returning
> new JacksonJsonProvider()
>
> It can also be auto-scanned - but I found in my experiments that
> muiltiple Jackson providers can be picked up, so I'd rather return an
> instance from the code
>
> Sergey
> On 17/08/16 17:40, J. Fiala wrote:
>> I try to run a CXF JAX-RS endpoint using Spring XML configuration and
>> Spring Boot.
>>
>> The services are listed correctly when I access the server and the
>> WADL/Swagger endpoint is generated correctly:
>>
>> http://localhost:8080/services/
>>
>> The API methods are annoted with:
>> @Consumes("application/json")
>> @Produces("application/json")
>>
>> However, when I invoke any service using Json, I get:
>>
>> |JAXBException occurred : unable to marshal type "..." as an element
>> because it is missing an @XmlRootElement annotation. unable to marshal
>> type "..." as an element because it is missing an @XmlRootElement
>> annotation. |
>>
>> I'm using wadl2java to generate the api and model classes at server side
>> from the WADL, so there are @XmlAccessorType/@XmlType annotation in my
>> model classes on the server side.
>>
>> Spring-Boot/CXF seems ignore the provider configured in the Spring
>> configuration XML (which is working perfectly if deployed without Spring
>> Boot to e.g. Jboss/Tomcat):
>> <bean id="jsonProvider"
>> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
>>
>> How can I set the JacksonJsonProvider to be used by Spring Boot/CXF, or
>> are model classes annotated with @Xml... not supported for Spring
>> Boot/CXF?
>>
>> Best regards,
>> Johannes
>>
>>
>
>
Re: Spring Boot CXF JAX-RS and Jackson Provider
Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
To be honest I'm not sure traditional Spring XML configuration files are
even supported with Spring Boot ? (XML is the old citizen, properties is
the new citizen :-)), but if it is then let me know how.
Are you using CXF 3.1.7 Spring Boot starter ?
I think you need to have a @Bean method returning
new JacksonJsonProvider()
It can also be auto-scanned - but I found in my experiments that
muiltiple Jackson providers can be picked up, so I'd rather return an
instance from the code
Sergey
On 17/08/16 17:40, J. Fiala wrote:
> I try to run a CXF JAX-RS endpoint using Spring XML configuration and
> Spring Boot.
>
> The services are listed correctly when I access the server and the
> WADL/Swagger endpoint is generated correctly:
>
> http://localhost:8080/services/
>
> The API methods are annoted with:
> @Consumes("application/json")
> @Produces("application/json")
>
> However, when I invoke any service using Json, I get:
>
> |JAXBException occurred : unable to marshal type "..." as an element
> because it is missing an @XmlRootElement annotation. unable to marshal
> type "..." as an element because it is missing an @XmlRootElement
> annotation. |
>
> I'm using wadl2java to generate the api and model classes at server side
> from the WADL, so there are @XmlAccessorType/@XmlType annotation in my
> model classes on the server side.
>
> Spring-Boot/CXF seems ignore the provider configured in the Spring
> configuration XML (which is working perfectly if deployed without Spring
> Boot to e.g. Jboss/Tomcat):
> <bean id="jsonProvider"
> class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
>
> How can I set the JacksonJsonProvider to be used by Spring Boot/CXF, or
> are model classes annotated with @Xml... not supported for Spring Boot/CXF?
>
> Best regards,
> Johannes
>
>
--
Sergey Beryozkin
Talend Community Coders
http://coders.talend.com/