1

I have a simple method in my Jersey app that returns a complex object called PodList:

@GET
 @Produces(MediaType.APPLICATION_JSON)
 @Path("/x")
 public PodList getPods(){
  try (KubernetesClient client = new DefaultKubernetesClient();) { 
   PodList pl = client.pods().list();
   ObjectMapper om = new ObjectMapper();
   try {
    String x = om.writeValueAsString(pl);
    System.out.println(x);
   } catch (JsonProcessingException ex) {
    Logger.getLogger(CatalogEndPoint.class.getName()).
      log(Level.SEVERE, null, ex);
   }
   return pl;
  } 
 }

No exception is caught in the catch block and I see the printout, so I am sure that Jackson is capable of serializing this type.

In my Grizzly setup code, I am sure to do this:

        final ResourceConfig rc = new ResourceConfig();
        rc.packages(CatalogEndPoint.class.getPackage().getName());
        rc.register(JacksonFeature.class);
  rc.property("jersey.config.server.tracing.type", "ALL");
  rc.property("jersey.config.server.tracing.threshold", "VERBOSE");

Note that I enabled server tracing, but it is useless. It doesn't trace anything when I hit my "/x" path on the CatalogEndPoint resource. So, what I did was to setup a java logging.properties file:

#logging.properties file.
# "handlers" specifies a comma separated list of log Handler 
# classes. These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.

 handlers= java.util.logging.ConsoleHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers. For any given facility this global level
# can be overriden by a facility-specific level.
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level=ALL
com.sun.jersey.level=ALL


# Limit the messages that are printed on the console to INFO and above.

    java.util.logging.ConsoleHandler.level = ALL
    java.util.logging.ConsoleHandler.formatter = 
                                    java.util.logging.SimpleFormatter

Then finally I can see the stack trace

INE: service exception
org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.type.TypeFactory.constructType(Ljava/lang/reflect/Type;Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JavaType;
 at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer$ResponseWriter.rethrow(GrizzlyHttpContainer.java:324)
 at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer$ResponseWriter.failure(GrizzlyHttpContainer.java:306)
 at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:509)
 at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:334)
 at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
 at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
 at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
 at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
 at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
 at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
 at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
 at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
 at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:384)
 at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:224)
 at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
 at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
 at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.type.TypeFactory.constructType(Ljava/lang/reflect/Type;Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JavaType;
 at com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector._fullSerializationType(JaxbAnnotationIntrospector.java:1465)
 at com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector._findContentAdapter(JaxbAnnotationIntrospector.java:1401)
 at com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector.findSerializationContentConverter(JaxbAnnotationIntrospector.java:804)
 at com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair.findSerializationContentConverter(AnnotationIntrospectorPair.java:372)
 at com.fasterxml.jackson.databind.ser.std.StdSerializer.findConvertingContentSerializer(StdSerializer.java:417)
 at com.fasterxml.jackson.databind.ser.std.MapSerializer.createContextual(MapSerializer.java:346)
 at com.fasterxml.jackson.databind.SerializerProvider.handlePrimaryContextualization(SerializerProvider.java:928)
 at com.fasterxml.jackson.databind.ser.AnyGetterWriter.resolve(AnyGetterWriter.java:89)
 at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.resolve(BeanSerializerBase.java:350)
 at com.fasterxml.jackson.databind.ser.SerializerCache.addAndResolveNonTypedSerializer(SerializerCache.java:197)
 at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1177)
 at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:490)
 at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:688)
 at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:107)
 at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1428)
 at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:930)
 at com.fasterxml.jackson.jaxrs.base.ProviderBase.writeTo(ProviderBase.java:650)
 at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265)
 at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)
 at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
 at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106)
 at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
 at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86)
 at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
 at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130)
 at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:711)
 at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444)
 at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434)
 at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329)
 ... 13 more

2 Answers2

0

Probably a library version difference between your compile-time and runtime environments.

The message says your compiled code tried to invoke method

constructType(Type t, Class c)

in class com.fasterxml.jackson.databind.type.TypeFactory but that method doesn't exist. Since it compiled successfully, you compiled against a version of the library that has that method but it is not available in the version available at runtime.

Jim Garrison
  • 85,615
  • 20
  • 155
  • 190
0

In my project's Maven pom.xml, I had explicitly included Jackson dependencies. This was the wrong thing to do because it caused version mismatches between what version of Jackson Jersey was expecting. The solution was to let Jersey decide what version of Jackson to use, by including this dependency in my pom instead of trying to pick the jackson version myself:

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
    </dependency> 

Also see: Should we use jersey-media-json-jackson or jackson-jaxrs-json-provider in Jersey 2.5.1?

Also See: Spring 4.2.3 and fasterxml Jackson 2.7.0 are incompatible

Community
  • 1
  • 1