Just thaught I'd chip in: I've seen in your class that you are using the old annotations (JsonProperty) from the old package org.codehaus.jackson.*. The new packages are com.fasterxml.jackson.*, so make sure to use those; the class names haven't changed, but the packages did. That can cause some confusing when you've got both version on the compile classpath.

I'm also pretty sure that your CustomObjectMapperProvider provides an old ObjectMapper from the codehaus packages.


HTH
--
Pascal Gélinas | Software Developer
*Nu Echo Inc. *
1435, Saint-Alexandre, Suite 200, Montreal (Qc),Canada, H3A 2G4
Tel: (514) 861-3246 ext 4234 | FAX: (514) 861-1676
pascal.geli...@nuecho.com <mailto:pascal.geli...@nuecho.com> | www.nuecho.com <http://www.nuecho.com/> | blog.nuecho.com <http://blog.nuecho.com/>

*Because performance matters. *


On 05/25/2013 06:20 PM, Charles wrote:
Hi,

I am using Resteasy 3.0-beta5 Skeleton Key in my project. I have setup the whole thing...SSL certs, skeleton key config and so on. I am using the OAuthManagedResourceValve to secure a jax-rs API. After authentication from the sso server, I get the following exception.

00:07:15,581 INFO [org.jboss.as <http://org.jboss.as>] (Controller Boot Thread) JBAS015874: WildFly 8.0.0.Alpha1 "WildFly" started in 29220ms - Started 1153 of 1247 services (228 services are lazy, passive or on-demand) 00:07:25,144 INFO [org.jboss.resteasy.skeleton.key.as7.OAuthAuthenticationServerValve] (ajp-/192.168.1.101:8009-1) --- invoke: /login.jsp 00:07:32,068 INFO [org.jboss.resteasy.skeleton.key.as7.OAuthAuthenticationServerValve] (ajp-/192.168.1.101:8009-1) --- invoke: /j_security_check 00:07:32,069 INFO [org.jboss.resteasy.skeleton.key.as7.OAuthAuthenticationServerValve] (ajp-/192.168.1.101:8009-1) <--- Begin oauthAuthenticate 00:07:32,140 INFO [org.jboss.resteasy.skeleton.key.as7.OAuthAuthenticationServerValve] (ajp-/192.168.1.101:8009-1) authenticate userSessionManage.login(): foobar 00:07:32,259 INFO [org.jboss.resteasy.skeleton.key.as7.OAuthAuthenticationServerValve] (ajp-/192.168.1.101:8009-1) --- sign access code 00:07:32,289 INFO [org.jboss.resteasy.skeleton.key.as7.OAuthAuthenticationServerValve] (ajp-/192.168.1.101:8009-1) --- build redirect 00:07:32,290 INFO [org.jboss.resteasy.skeleton.key.as7.OAuthAuthenticationServerValve] (ajp-/192.168.1.101:8009-1) <--- end oauthAuthenticate 00:07:33,183 INFO [org.jboss.resteasy.skeleton.key.as7.OAuthAuthenticationServerValve] (ajp-/192.168.1.101:8009-2) --- invoke: /j_oauth_resolve_access_code 00:07:33,390 INFO [org.jboss.resteasy.skeleton.key.as7.ServletOAuthLogin] (ajp-/192.168.1.101:8009-1) media type: application/json 00:07:33,390 INFO [org.jboss.resteasy.skeleton.key.as7.ServletOAuthLogin] (ajp-/192.168.1.101:8009-1) Content-Type header: application/json 00:07:34,810 ERROR [org.apache.catalina.connector] (ajp-/192.168.1.101:8009-1) JBWEB001018: An exception or error occurred in the container during the request processing: org.jboss.resteasy.spi.ReaderException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "access_token" (class org.jboss.resteasy.skeleton.key.representations.AccessTokenResponse), not marked as ignorable (4 known properties: , "token", "expiresIn", "tokenType", "refreshToken"]) at [Source: org.jboss.resteasy.client.core.SelfExpandingBufferredInputStream@934ef4; line: 1, column: 18] (through reference chain: org.jboss.resteasy.skeleton.key.representations.AccessTokenResponse["access_token"]) at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:227) [resteasy-client-3.0-beta-5.jar:] at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readEntity(ClientResponse.java:135) [resteasy-client-3.0-beta-5.jar:] at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:193) [resteasy-jaxrs-3.0-beta-5.jar:] at org.jboss.resteasy.skeleton.key.as7.ServletOAuthLogin.resolveCode(ServletOAuthLogin.java:283) [skeleton-key-as7-3.0-beta-5.jar:] at org.jboss.resteasy.skeleton.key.as7.OAuthManagedResourceValve.oauth(OAuthManagedResourceValve.java:272) [skeleton-key-as7-3.0-beta-5.jar:] at org.jboss.resteasy.skeleton.key.as7.OAuthManagedResourceValve.authenticate(OAuthManagedResourceValve.java:174) [skeleton-key-as7-3.0-beta-5.jar:] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:447) [jbossweb-8.0.0.Alpha1.jar:8.0.0.Alpha1] at org.jboss.resteasy.skeleton.key.as7.OAuthManagedResourceValve.invoke(OAuthManagedResourceValve.java:137) [skeleton-key-as7-3.0-beta-5.jar:] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [wildfly-web-8.0.0.Alpha1.jar:8.0.0.Alpha1] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-8.0.0.Alpha1.jar:8.0.0.Alpha1] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-8.0.0.Alpha1.jar:8.0.0.Alpha1] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:559) [jbossweb-8.0.0.Alpha1.jar:8.0.0.Alpha1] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-8.0.0.Alpha1.jar:8.0.0.Alpha1] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) [jbossweb-8.0.0.Alpha1.jar:8.0.0.Alpha1] at org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:473) [jbossweb-8.0.0.Alpha1.jar:8.0.0.Alpha1] at org.apache.coyote.ajp.AjpAprProtocol$AjpConnectionHandler.process(AjpAprProtocol.java:454) [jbossweb-8.0.0.Alpha1.jar:8.0.0.Alpha1] at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:2036) [jbossweb-8.0.0.Alpha1.jar:8.0.0.Alpha1]
at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_01]
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "access_token" (class org.jboss.resteasy.skeleton.key.representations.AccessTokenResponse), not marked as ignorable (4 known properties: , "token", "expiresIn", "tokenType", "refreshToken"]) at [Source: org.jboss.resteasy.client.core.SelfExpandingBufferredInputStream@934ef4; line: 1, column: 18] (through reference chain: org.jboss.resteasy.skeleton.key.representations.AccessTokenResponse["access_token"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79) [jackson-databind-2.2.1.jar:2.2.1] at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555) [jackson-databind-2.2.1.jar:2.2.1] at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:708) [jackson-databind-2.2.1.jar:2.2.1] at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1159) [jackson-databind-2.2.1.jar:2.2.1] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:315) [jackson-databind-2.2.1.jar:2.2.1] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) [jackson-databind-2.2.1.jar:2.2.1] at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1179) [jackson-databind-2.2.1.jar:2.2.1] at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:635) [jackson-databind-2.2.1.jar:2.2.1] at org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.readFrom(ResteasyJackson2Provider.java:120) [resteasy-jackson2-provider-3.0-beta-5.jar:] at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:45) [resteasy-jaxrs-3.0-beta-5.jar:] at org.jboss.resteasy.security.doseta.DigitalVerificationInterceptor.aroundReadFrom(DigitalVerificationInterceptor.java:32) at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:48) [resteasy-jaxrs-3.0-beta-5.jar:] at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.aroundReadFrom(GZIPDecodingInterceptor.java:59) [resteasy-jaxrs-3.0-beta-5.jar:] at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:48) [resteasy-jaxrs-3.0-beta-5.jar:] at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:191) [resteasy-client-3.0-beta-5.jar:]
... 17 more


I have written a custom JacksonJsonProvider and ObjectMapper context resolver as follows:

@Provider
@Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants
@Produces(MediaType.WILDCARD)
public class CustomJacksonJsonProvider extends JacksonJsonProvider {
public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
private Logger log = Logger.getLogger( this.getClass() );
public CustomJacksonJsonProvider(){
super();
try {
 _mapperConfig.setMapper( new ObjectMapper()
.registerModule( new Hibernate4Module().configure( Hibernate4Module.Feature.FORCE_LAZY_LOADING, false ) )
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(MapperFeature.USE_ANNOTATIONS, true)
.configure(MapperFeature.AUTO_DETECT_FIELDS, false)
.setDateFormat(new SimpleDateFormat(DATE_FORMAT)));
log.info <http://log.info>( "FooBar API CustomJacksonJsonProvider initialized successfully" );
} catch (Exception e) {
e.printStackTrace();
log.error( "FooBar API CustomJacksonJsonProvider initialization failed" );
}
}
@Override
public boolean isReadable(Class<?> aClass, Type type,
Annotation[] annotations, MediaType mediaType) {
if (FindAnnotation.findAnnotation(aClass, annotations, NoJackson.class) != null)
return false;
return super.isReadable(aClass, type, annotations, mediaType);
}

@Override
public boolean isWriteable(Class<?> aClass, Type type,
Annotation[] annotations, MediaType mediaType) {
if (FindAnnotation.findAnnotation(aClass, annotations, NoJackson.class) != null)
return false;
return super.isWriteable(aClass, type, annotations, mediaType);
}
@Override
public void writeTo(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String,Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { super.writeTo(value, type, genericType, annotations, mediaType, httpHeaders, entityStream);
}

}


@Provider
public class CustomObjectMapperProvider implements ContextResolver<ObjectMapper> {
    private ObjectMapper mapper;
    public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private Logger log = Logger.getLogger( this.getClass() );

    public CustomObjectMapperProvider() throws Exception {
        this.mapper = new ObjectMapper();
mapper.registerModule( new Hibernate4Module().configure( Hibernate4Module.Feature.FORCE_LAZY_LOADING, false ) );
mapper.setDateFormat( new SimpleDateFormat(DATE_FORMAT) );
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setSerializationInclusion( Include.NON_NULL);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper.configure( MapperFeature.AUTO_DETECT_FIELDS, true );
mapper.setAnnotationIntrospector( new JacksonAnnotationIntrospector() );
log.info <http://log.info>( "FooBar API CustomObjectMapperProvider initialized successfully" );
    }
    public ObjectMapper getContext(Class<?> objectType) {
log.info <http://log.info>( "getMapper called" );
        return mapper;
    }
}


But it seems my ObjectMapper context resolver isn't being called when an object mapper is needed.

By the way, the source for the POJO involved in the exception can be found here: https://github.com/resteasy/Resteasy/blob/master/jaxrs/security/skeleton-key-idm/skeleton-key-core/src/main/java/org/jboss/resteasy/skeleton/key/representations/AccessTokenResponse.java


Any help would be greatly appreciated.

Thanks.


------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may


_______________________________________________
Resteasy-users mailing list
Resteasy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/resteasy-users


------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. A cloud service to automate IT design, transition and operations
2. Dashboards that offer high-level views of enterprise services
3. A single system of record for all IT processes
http://p.sf.net/sfu/servicenow-d2d-j
_______________________________________________
Resteasy-users mailing list
Resteasy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/resteasy-users

Reply via email to