如何在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?
谢谢
VladimirDateTimeDeserializer的源代码显示它在反序列化期间使用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"),
...