csdn/CSDN博文备份/JSON反对序列化publicfinalclassLocalDateTime日期格式错误-143173959.md
2024-10-23 08:40:44 +08:00

1 line
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<p>错误日志为:</p> <br><p></p> <br><pre><code>java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2023-09-18T21:56:41.515Z')<br> at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 6243] (through reference chain: com.ossez.discourse.common.model.dto.Topic["created_at"])<br><br> at com.ossez.discourse.client.service.TopicsService.getTopic(TopicsService.java:60)<br> at com.ossez.discourse.client.test.TopicServiceTest.testGetTopic(TopicServiceTest.java:37)<br> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)<br> at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)<br> at java.base/java.lang.reflect.Method.invoke(Method.java:568)<br> at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727)<br> at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)<br> at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)<br> at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156)<br> at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147)<br> at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)<br> at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)<br> at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)<br> at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)<br> at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)<br> at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)<br> at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)<br> at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92)<br> at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86)<br> at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217)<br> at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)<br> at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213)<br> at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138)<br> at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)<br> at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)<br> at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)<br> at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)<br> at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)<br> at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)<br> at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)<br> at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)<br> at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)<br> at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)<br> at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)<br> at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)<br> at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)<br> at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)<br> at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)<br> at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)<br> at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)<br> at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)<br> at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:147)<br> at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:127)<br> at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:90)<br> at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:55)<br> at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:102)<br> at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:54)<br> at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)<br> at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)<br> at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)<br> at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)<br> at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)<br> at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)<br> at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)<br> at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)<br> at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)<br> at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)<br>Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2023-09-18T21:56:41.515Z')<br> at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 6243] (through reference chain: com.ossez.discourse.common.model.dto.Topic["created_at"])<br> at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)<br> at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1589)<br> at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1055)<br> at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371)<br> at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323)<br> at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1373)<br> at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:171)<br> at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)<br> at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)<br> at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)<br> at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)<br> at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)<br> at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205)<br> at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173)<br> at com.ossez.discourse.client.service.TopicsService.getTopic(TopicsService.java:56)<br> ... 71 more<br></code></pre> <br><p>我们尝试反序列化的日子格式为:</p> <br><p>String-argument constructor/factory method to deserialize from String value (2023-09-18T21:56:41.515Z)</p> <br><h3>问题和解决</h3> <br><p>我们通常可以通过添加 JRS310 支持格式来解决。</p> <br><p>POM 文件中添加:</p> <br><p></p> <br><pre><code><dependency><br> <groupId>com.fasterxml.jackson.datatype</groupId><br> <artifactId>jackson-datatype-jsr310</artifactId><br> <version>2.17.2</version><br> </dependency></code></pre> <br><p>同时 ObjectMapper 中需要进行注册。</p> <br><p>注册的代码为:</p> <br><p><code>objectMapper.registerModule(new JavaTimeModule());</code></p> <br><p></p> <br><p></p> <br><p class="img-center"><a href="https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/4/4b12e704b100c030783f334d71a5e9c9020470ca.png" rel="nofollow"><img alt="2024-10-22_18-29-53" height="318" src="https://img-blog.csdnimg.cn/img_convert/c5f4dfd278fe6620f509c617a1abd270.png" width="690" /></a></p> <br><p></p> <br><p>下图中可以看到反序列化后对象中的数据。</p> <br><p></p> <br><p></p> <br><p class="img-center"><a href="https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/c/c3578d66d55a538d34de659722e2b383e134d84a.png" rel="nofollow"><img alt="2024-10-22_18-31-06" height="499" src="https://img-blog.csdnimg.cn/img_convert/4e3407080443bc7886219d545351bc90.png" width="629" /></a></p> <br><p><a href="https://www.isharkfly.com/t/json-public-final-class-localdatetime/16452" rel="nofollow" title="JSON 反对序列化 public final class LocalDateTime 日期格式错误 - Java - iSharkFly">JSON 反对序列化 public final class LocalDateTime 日期格式错误 - Java - iSharkFly</a></p> <br><p></p> <br><p></p>