从 Websphere App Server 切换到 Open Liberty 时出现序列化错误

问题描述 投票:0回答:1

我正在将一个 java 8 应用程序从 WAS 8.5 移动到 Open Liberty 23。该应用程序运行,但在某个 REST 控制器中序列化某些数据时出现以下异常。没有对代码或库进行任何更改。唯一的区别是我现在尝试从 eclipse open liberty 插件而不是 myeclipse WAS 插件运行应用程序。

我不清楚在哪里寻找这个问题。看起来 spring 可能没有使用相同的 Jackson 版本?请注意,相同的代码在 WAS 中运行良好。为什么我在序列化时会出现这样的错误?

一些想法:

  • 我假设 servlet jar 是不同的。我在堆栈跟踪中看到 javax.servlet.http.HttpServlet.service,这就是我提到这一点的原因。我有点困惑 Open Liberty 的 servlet jar 是从哪里来的。 OL eclipse插件好像没有包含这个。
  • WAS 具有父一级加载器,如此处所述 - https://www.ibm.com/docs/en/was/8.5.5?topic=loading-configuring-class-loaders-server。 WAS 有一些 Jackson 类 - Jackson Version with WebSphere 8.5.5。我不认为这是问题,因为我的应用程序有 jackson 2.11 & WAS 有 jackson 1.6.2。 Jackson 包名称在这些版本之间发生了变化,因此我的应用程序应该在 WAS 和 OL 中使用相同的 jackson 类。

有什么想法吗?

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: com.test.apps.models.image cannot be cast to java.lang.Integer (through reference chain: com.apps.models.Response["data"]->com.apps.models.SearchResults["otherdata"]->com.apps.models.Information["dataGroup"]->java.util.ArrayList[0]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: com.apps.models.Image cannot be cast to java.lang.Integer (through reference chain: com.apps.models.Response["data"]->com.apps.SearchResults["otherdata"]->com.apps.Information["dataGroup"]->java.util.ArrayList[0])
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:207)
    at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:180)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:143)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:89)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:189)
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:69)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1258)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:746)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:443)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:193)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:98)
    at com.test.apps.filters.SessionValidationFilter.doFilter(SessionValidationFilter.java:56)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:201)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
    at com.test.apps.filters.Log4JFilter.doFilter(Log4JFilter.java:62)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:201)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:1002)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1140)
    at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:5049)
    at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.handleRequest(DynamicVirtualHost.java:314)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1007)
    at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:279)
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:1159)
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.wrapHandlerAndExecute(HttpDispatcherLink.java:428)
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.ready(HttpDispatcherLink.java:387)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:566)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleNewRequest(HttpInboundLink.java:500)
    at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.processRequest(HttpInboundLink.java:360)
    at com.ibm.ws.http.channel.internal.inbound.HttpICLReadCallback.complete(HttpICLReadCallback.java:70)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager.requestComplete(WorkQueueManager.java:504)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager.attemptIO(WorkQueueManager.java:574)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager.workerRun(WorkQueueManager.java:958)
    at com.ibm.ws.tcpchannel.internal.WorkQueueManager$Worker.run(WorkQueueManager.java:1047)
    at com.ibm.ws.threading.internal.ExecutorServiceImpl$RunnableWrapper.run(ExecutorServiceImpl.java:238)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: com.test.apps.models.image cannot be cast to java.lang.Integer (through reference chain: com.apps.models.Response["data"]->com.apps.models.SearchResults["otherdata"]->com.apps.models.Information["datagroup"]->java.util.ArrayList[0])
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:211)
    at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:209)
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContentsUsing(IndexedListSerializer.java:124)
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:63)
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:21)
    at com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:180)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:544)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:551)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:143)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:544)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:551)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:143)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:544)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:551)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.se
rialize(BeanSerializer.java:143)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:120)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:1727)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:204)
    ... 48 more
Caused by: java.lang.ClassCastException: com.test.apps.models.image cannot be cast to java.lang.Integer
    at com.fasterxml.jackson.databind.ser.std.NumberSerializers$IntegerSerializer.serialize(NumberSerializers.java:61)
    at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContentsUsing(IndexedListSerializer.java:118)
java spring jackson websphere open-liberty
1个回答
0
投票

IBM 有一个用于应用程序二进制文件的应用程序迁移工具包(二进制扫描仪)。该工具用于扫描应用程序并创建有关迁移问题的报告,包括从 WebSphere 8.5 迁移到 Open Liberty。该工具也有助于其他迁移场景,例如更改 java 版本。

通过使用二进制扫描器扫描应用程序,您可能会更接近地发现平台迁移中出现的问题 - http://ibm.biz/WAMT4AppBinaries

文档 - https://www.ibm.com/docs/SSRQNQ/applicationBinaryMigration/overview.html

© www.soinside.com 2019 - 2024. All rights reserved.