对于我正在从事的项目,需要使用库io.jsonwebtoken (jjwt)提供的Spring Security和JSON Webtokens。我需要添加到生成的令牌中的声明之一是以下实体(简化以说明问题):
@Entity
public class MyEntity {
private String name;
private LocalDateTime ldt;
}
此方法有效,但是将生成的Webtoken序列化如下:
{
"sub": "[email protected]",
"exp": 1523659655,
"entity": {
"name": testname,
"ldt": {
"hour": 0,
"minute": 37,
"dayOfMonth": 12,
"dayOfWeek": "THURSDAY",
"dayOfYear": 102,
"year": 2018,
"month": "APRIL",
"monthValue": 4,
"second": 38,
"nano": 569000000,
"chronology": {
"calendarType": "iso8601",
"id": "ISO"
}
}
}
}
这看起来似乎不是问题,但实际上,当稍后需要我再次将其映射到MyEntity实例时,这实际上是一个问题。在线阅读一番后,我发现我需要更改ObjectMapper的配置,以更改配置选项(将
WRITE_DATES_AS_TIMESTAMPS
标志切换为false)。但是,我无法更改jjwt使用的ObjectMapper的配置,因为它是这样构造的(jjwt的来源):public class DefaultJwtBuilder implements JwtBuilder {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
...
}
我在网上发现的另一种选择是将以下行放入我的application.properties文件中:
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false
仍然没有用,jjwt使用的ObjectMapper似乎忽略了这些属性。
我该怎么做才能实现自己的目标?
最佳答案
Jjwt文档指出(从0.10.0版本开始),您可以使用特定的编译依赖项注入自己的ObjectMapper
,并按以下方式实现注入:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.5</version>
<scope>compile</scope> <!-- Not runtime -->
</dependency>
...然后将映射器添加到
JwtBuilder
:ObjectMapper objectMapper = getMyObjectMapper(); //implement me
String jws = Jwts.builder()
.serializeToJsonWith(new JacksonSerializer(objectMapper))
// ... etc ...
为documented here
关于java - JJWT/Jackson更改了使用的ObjectMapper,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49812280/