Проблема в том, что по умолчанию JJWT не включает значения NULL в JWT (или, по крайней мере, это вроде так и есть). Несмотря на это, внутренние сериализованные объекты содержат нулевые свойства.
Вот как я их добавляю, и решение, которое я пытался реализовать, заключается в настройке ObjectMapper и его использовании. в построителе JWT.
Код: Выделить всё
public String generateTokenFromJwtUserDetails(JwtUserDetails userDetails) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + jwtExpiration);
Map claims = new HashMap();
claims.put("name", userDetails.getName()); // null, will not appear in jwt
claims.put("id", userDetails.getId()); // not null, appears
claims.put("tenant", userDetails.getTenant()); // contains null values that do end up in jwt
// rest of claims...
// here I tried to set serialization inclusion in a custom object mapper, doesn't work
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
// I also tried this, but won't work either
//objectMapper.enable(SerializationFeature.WRITE_NULL_MAP_VALUES);
try{
return Jwts.builder()
.json(new JacksonSerializer(objectMapper))
.claims(claims)
.subject(userDetails.getUsername())
.issuedAt(now)
.expiration(expiryDate)
.signWith(getSignInKey())
.issuer(jwtIssuer)
.compact();
}catch(Exception e){ // ...
}
- Я также включаю объекты внутри моего JWT, эти объекты сериализуются Джексоном со всеми их полей (поэтому у меня есть вложенные объекты с нулевыми значениями, но внешний JWT их не принимает). Например:
Код: Выделить всё
{
"id": "ibn12u3bio412i",
"tenant": {
"deletedOn": null,
}
}
- HashMap содержит все ключи и значения, даже если они равны нулю.
- Я' Я знаю, что JWT не должны содержать нулевые данные, но в этой ситуации я не могу контролировать клиент.
Подробнее здесь: https://stackoverflow.com/questions/790 ... wt-jackson