对于我正在进行的项目,我需要使用库io.jsonwebtoken (jjwt)提供的Security和JSON。我需要在生成的令牌中添加的声明之一是以下实体(简化以说明问题):
@Entity
public class MyEntity {
private String name;
private LocalDateTime ldt;
}这是可行的,但是得到的webtoken被序列化如下:
{
"sub": "testuser@mydomain.com",
"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-flag切换为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似乎忽略了这些属性,但没有效果。
我该怎么做才能实现我的目标呢?
发布于 2019-02-06 13:00:05
Jjwt文档声明(版本为0.10.0及on)您可以使用特定的编译依赖注入您自己的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 ...as 记录在这里
发布于 2018-04-13 08:43:29
我通过重写DefaultJwtBuilder来修复它,如下所示:
public class CustomJwtBuilder extends DefaultJwtBuilder {
private static final ObjectMapper mapper = new Jackson2ObjectMapperBuilder()
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.modulesToInstall(new JavaTimeModule())
.build();
@Override
protected byte[] toJson(Object object) throws JsonProcessingException {
return mapper.writeValueAsBytes(object);
}
}然后创建这样的令牌
String token = new CustomJwtBuilder()
.setSubject(..)
.setExpiration(...)
.compact();发布于 2019-10-10 05:28:24
通常,当编译器无法在类路径上发现任何JSON序列化器实现时,就会发生这种情况。包括下面的jjwt依赖和重建项目。它解决了我的问题。
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.5</version>
<scope>compile</scope>
</dependency>https://stackoverflow.com/questions/49812280
复制相似问题