users@jersey.java.net

[Jersey] Re: can't get FEATURE_POJO_MAPPING working (spring, jersey, grizzly)

From: Glen Mazza <gmazza_at_talend.com>
Date: Wed, 22 Feb 2012 10:49:39 -0500

Hmm. The MyObjectMapperProvider in Jersey trunk branch is much smaller
than the one in the Jersey Version 1.11 samples
(http://maven.java.net/service/local/artifact/maven/redirect?r=releases&g=com.sun.jersey.samples&a=jersey-samples&v=1.11&e=zip&c=project),
I would try the latter as it's possible TRUNK is missing functionality.
I would first confirm you can get the Jersey sample working, as it's a
known quantity (I was able to do get it work with both with Jersey and
CXF: http://www.jroller.com/gmazza/entry/jersey_samples_on_cxf) and then
extrapolate to your own project to get that working.

See also: http://java.net/jira/browse/JERSEY-989

Glen

On 02/22/2012 10:08 AM, Gonfi den Tschal wrote:
> the manual at http://jersey.java.net/nonav/documentation/latest/json.html
> for "5.1. POJO support" doesn't say that a custom provider needs to be
> registered.
>
>
> On Wed, Feb 22, 2012 at 5:03 PM, Gonfi den Tschal
> <gonfidentschal_at_gmail.com> wrote:
>> no, didn't.
>>
>> now i've added the class:
>>
>> @Provider
>> public class MyObjectMapperProvider implements ContextResolver<ObjectMapper> {
>>
>> final ObjectMapper defaultObjectMapper;
>>
>> public MyObjectMapperProvider() {
>> defaultObjectMapper = createDefaultMapper();
>> }
>>
>> @Override
>> public ObjectMapper getContext(Class<?> type) {
>> return defaultObjectMapper;
>> }
>>
>> private static ObjectMapper createDefaultMapper() {
>> ObjectMapper result = new ObjectMapper();
>> result.configure(Feature.INDENT_OUTPUT, true);
>> return result;
>> }
>> }
>>
>> i can't register it as in the example since i don't have an "Application".
>> instead i have a ResourceConfig, and i tried:
>>
>> rc.getProviderClasses().add(MyObjectMapperProvider.class);
>>
>> but that didn't change anything.
>>
>>
>>
>>
>> On Wed, Feb 22, 2012 at 4:09 PM, Glen Mazza<gmazza_at_talend.com> wrote:
>>> Did you link in something similar to the MyObjectMapperProvider class as
>>> given in the jacksonjsonprovider sample?
>>> (http://java.net/projects/jersey/sources/svn/content/trunk/jersey/samples/jacksonjsonprovider/src/main/java/com/sun/jersey/samples/jacksonjsonprovider/MyApplication.java?rev=4816)
>>> That might be the issue.
>>>
>>> Glen
>>>
>>>
>>> On 02/21/2012 08:40 PM, Gonfi den Tschal wrote:
>>>> having troubles getting marshalling to work.
>>>>
>>>> setup:
>>>> - spring
>>>> - jersey
>>>> - grizzly
>>>>
>>>>
>>>> maven dependencies:
>>>>
>>>> <dependency>
>>>> <groupId>com.sun.jersey.contribs</groupId>
>>>> <artifactId>jersey-spring</artifactId>
>>>> <version>1.11</version>
>>>> <exclusions>
>>>> <exclusion>
>>>> <groupId>org.springframework</groupId>
>>>> <artifactId>spring</artifactId>
>>>> </exclusion>
>>>> <exclusion>
>>>> <groupId>org.springframework</groupId>
>>>> <artifactId>spring-core</artifactId>
>>>> </exclusion>
>>>> <exclusion>
>>>> <groupId>org.springframework</groupId>
>>>> <artifactId>spring-web</artifactId>
>>>> </exclusion>
>>>> <exclusion>
>>>> <groupId>org.springframework</groupId>
>>>> <artifactId>spring-beans</artifactId>
>>>> </exclusion>
>>>> <exclusion>
>>>> <groupId>org.springframework</groupId>
>>>> <artifactId>spring-context</artifactId>
>>>> </exclusion>
>>>> </exclusions>
>>>> </dependency>
>>>> <dependency>
>>>> <groupId>com.sun.jersey</groupId>
>>>> <artifactId>jersey-json</artifactId>
>>>> <version>1.11</version>
>>>> </dependency>
>>>> <dependency>
>>>> <groupId>com.sun.jersey</groupId>
>>>> <artifactId>jersey-grizzly2</artifactId>
>>>> <version>1.11</version>
>>>> </dependency>
>>>>
>>>> starting the server:
>>>> ResourceConfig rc = new DefaultResourceConfig();
>>>> rc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
>>>> Boolean.TRUE);
>>>> IoCComponentProviderFactory factory = new
>>>> SpringComponentProviderFactory(rc, context);
>>>> try {
>>>> GrizzlyServerFactory.createHttpServer(getBaseUri(),
>>>> rc, factory);
>>>> } catch (IOException e) {
>>>> throw new RuntimeException("Failed starting REST web
>>>> server!", e);
>>>> }
>>>>
>>>> the service:
>>>>
>>>> @Service
>>>> @Path("/ping")
>>>> @Produces({"application/json"})
>>>> public class PingService {
>>>>
>>>> @GET @Path("/foo")
>>>> public String foo(@QueryParam("bar") final Bar bar) {
>>>> }
>>>>
>>>> }
>>>>
>>>> sending a type String instead of Bar works fine. as soon as i send
>>>> objects i get all kinds of errors.
>>>>
>>>> bar class:
>>>>
>>>> public class Bar {
>>>>
>>>> private String field1;
>>>> private String field2;
>>>>
>>>> public String getField1() {
>>>> return field1;
>>>> }
>>>> public void setField1(String field1) {
>>>> this.field1 = field1;
>>>> }
>>>>
>>>> public String getField2() {
>>>> return field2;
>>>> }
>>>> public void setField2(String field2) {
>>>> this.field2 = field2;
>>>> }
>>>> }
>>>>
>>>> with this setup, when starting the server, i get:
>>>>
>>>> SEVERE: Missing dependency for method public java.lang.String
>>>> mypackage.PingService.foo(mypackage.Bar) at parameter at index 0
>>>> SEVERE: Method, public java.lang.String
>>>> mypackage.PingService.foo(mypackage.Bar), annotated with GET of
>>>> resource, class mypackage.PingService, is not recognized as valid
>>>> resource method.
>>>>
>>>>
>>>> if i annotate the Bar class with @XmlRootElement (which i don't want,
>>>> because i cannot touch the classes i would need to transfer) then the
>>>> server starts, but calling the method results in a 404 even though the
>>>> get request looks fine.
>>>>
>>>> most examples out there just use strings as inputs.
>>>>
>>>> been trying for hours, giving up. any idea what else i should check or
>>>> try or read?
>>>
>>>
>>> --
>>> Glen Mazza
>>> Talend Community Coders
>>> coders.talend.com
>>> blog: www.jroller.com/gmazza
>>>


-- 
Glen Mazza
Talend Community Coders
coders.talend.com
blog: www.jroller.com/gmazza