如何在Spring框架和Jackson中使用Java14记录

如何在Spring框架和Jackson中使用Java14记录,java,spring,jackson,jackson-databind,java-14,Java,Spring,Jackson,Jackson Databind,Java 14,我有以下简单的测试 import org.springframework.web.client.RestTemplate; import pages.TimezonePage; class GETSimple { private RestTemplate restTemplate; private String URL = "http://worldtimeapi.org/api/timezone/America/Los_Angeles"; @BeforeEach

我有以下简单的测试

import org.springframework.web.client.RestTemplate;
import pages.TimezonePage;

class GETSimple
{
    private RestTemplate restTemplate;
    private String URL = "http://worldtimeapi.org/api/timezone/America/Los_Angeles";

    @BeforeEach
    void setUp()
    {
        restTemplate = new RestTemplate();
    }

    @Test
    void GETasPOJO()
    {
        TimezonePage response = restTemplate.getForObject(URL, TimezonePage.class);
        assertEquals("PDT", response.getAbbreviation());
        assertTrue(response.getDst());
    }
}
这对于具有getter和setter的TimezonePage类来说很好。 下面是pom.xml的相关部分

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.3</version>
</dependency>
没有语法错误。 运行测试时,我收到以下异常

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class pages.TimezoneRecord]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `pages.TimezoneRecord` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
有办法解决吗?或者我不能把杰克逊和唱片一起当作pojo? 谢谢
Vladimir

DateTimeDeserializer的源代码显示它在反序列化期间使用ObjectMapper提供的来自反序列化上下文的时区。如果查看ObjectMapper API,您将看到有一种设置时区页面的方法:

public ObjectMapper setTimeZone(TimeZone tz)
因此,您可以使用此方法配置ObjectMapper并将时区设置为正确的时区

关于默认值,Javadoc似乎说了一件事,但代码显示了另一件事

Javadoc for ObjectMapper.setTimeZone(TimeZone tz):
/** *方法重写用于格式化的默认时区。 *使用的默认值为{@link TimeZonegetDefault}。 */ 但是,该代码将时区显式设置为:

protected final static BaseSettings DEFAULT_BASE = new BaseSettings(
    ...
    // TimeZone.getDefault()
    TimeZone.getTimeZone("GMT"),
    ...
显然,它实际上使用的是GMT,而不是默认的JVM


我想说的是,最好的选择可能不是依赖于此,而是自己在ObjectMapper.setTimeZoneTimeZone tz上设置它。

记录是如此的新,而且在预览中,很少有库能够很好地支持它们。据我所知,Jackson还没有符合记录。看看这个答案:让我们希望Jackson开发人员能够解决POJO映射问题。时区代码只是说明问题的一个例子。你的回答没有解决这个问题。
protected final static BaseSettings DEFAULT_BASE = new BaseSettings(
    ...
    // TimeZone.getDefault()
    TimeZone.getTimeZone("GMT"),
    ...