1

ジャージー アプリには、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;
		}	
	}

catch ブロックで例外はキャッチされず、出力が表示されるので、Jackson がこの型をシリアル化できると確信しています。

私の Grizzly セットアップ コードでは、必ず次のようにします。

        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");

サーバー トレースを有効にしましたが、役に立たないことに注意してください。CatalogEndPoint リソースの "/x" パスにアクセスしても、何もトレースされません。だから、私がしたことは、Java logging.properties ファイルをセットアップすることでした:

#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

そして最後にスタックトレースを見ることができます

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

4

2 に答える 2

0

私のプロジェクトの Maven pom.xml には、Jackson の依存関係を明示的に含めました。これは間違ったことでした。なぜなら、Jackson Jersey が予期していたバージョンとの間にバージョンの不一致が生じたからです。解決策は、ジャクソンのバージョンを自分で選択しようとするのではなく、この依存関係を pom に含めることで、Jersey に使用するジャクソンのバージョンを決定させることでした。

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

また、参照してください:Jersey 2.5.1 で jersey-media-json-jackson または jackson-jaxrs-json-provider を使用する必要がありますか?

参照: Spring 4.2.3 と fasterxml Jackson 2.7.0 は互換性がありません

于 2016-08-05T15:46:34.190 に答える
0

おそらく、コンパイル時環境とランタイム環境の間のライブラリ バージョンの違いです。

メッセージは、コンパイルされたコードがメソッドを呼び出そうとしたことを示しています

constructType(Type t, Class c)

クラスにcom.fasterxml.jackson.databind.type.TypeFactoryありますが、そのメソッドは存在しません。正常にコンパイルされたため、そのメソッドを持つライブラリのバージョンに対してコンパイルしましたが、実行時に利用可能なバージョンでは利用できません。

于 2016-08-05T15:39:43.763 に答える