Jackson用spring的接口列表反序列化对象

我需要从Redis保存和加载对象。

该对象包含GrantedAuthority列表(除其他外),它是一个接口:

public class UserAccountAuthentication implements Authentication {

private List<GrantedAuthority> authorities;

private boolean authenticated = true;

...

}

Jackson成功地序列化了该对象,但未能反序列化,但有以下例外:

abstract types can only be instantiated with additional type information

我知道我可以通过添加以下内容来指定类型:

@JsonTypeInfo(

但是在这种情况下我无法做到这一点,因为the GrantedAuthority是Spring的接口,我无法更改它。


序列化的json是:

{

"authorities": [

{

"authority": "ROLE_NORMAL_USER"

}

],

"authenticated": true,

"securityToken": {

"expiration": 1458635906853,

"token": "sxKi3Pddfewl2rgpatVE7KiSR5qGmhpGl0spiHUTLAAW8zuoLFE0VLFYcfk72VLnli66fcVmb8aK9qFavyix3bOwgp1DRGtGacPI",

"roles": [

"ROLE_NORMAL_USER"

],

"expired": false,

"expirationDateFormatted": "2016-03-22 08:38:26.853 UTC"

},

"name": "admin",

"expired": false

}


摘要GrantedAuthority只能用填充SimpleGrantedAuthority

所以我尝试了:

objectMapper.registerSubtypes(SimpleGrantedAuthority.class);

仍然没有运气。

回答:

我认为您需要添加自定义反序列化器

public class UserAccountAuthenticationSerializer extends JsonDeserializer<UserAccountAuthentication> {

@Override

public UserAccountAuthentication deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)

throws IOException {

UserAccountAuthentication userAccountAuthentication = new UserAccountAuthentication();

ObjectCodec oc = jsonParser.getCodec();

JsonNode node = oc.readTree(jsonParser);

userAccountAuthentication.setAuthenticated(node.get("authenticated").booleanValue());

Iterator<JsonNode> elements = node.get("authorities").elements();

while (elements.hasNext()) {

JsonNode next = elements.next();

JsonNode authority = next.get("authority");

userAccountAuthentication.getAuthorities().add(new SimpleGrantedAuthority(authority.asText()));

}

return userAccountAuthentication;

}

}

这是我的json

{"authenticated":true,"authorities":[{"authority":"role1"},{"authority":"role2"}],"details":null,"principal":null,"credentials":null,"name":null}

然后在您的POJO顶部

@JsonDeserialize(using = UserAccountAuthenticationSerializer.class)

public class UserAccountAuthentication implements Authentication {

这是测试

@Test

public void test1() throws IOException {

UserAccountAuthentication userAccountAuthentication = new UserAccountAuthentication();

userAccountAuthentication.setAuthenticated(true);

userAccountAuthentication.getAuthorities().add(new SimpleGrantedAuthority("role1"));

userAccountAuthentication.getAuthorities().add(new SimpleGrantedAuthority("role2"));

String json1 = new ObjectMapper().writeValueAsString(userAccountAuthentication);

UserAccountAuthentication readValue = new ObjectMapper().readValue(json1, UserAccountAuthentication.class);

String json2 = new ObjectMapper().writeValueAsString(readValue);

assertEquals(json1, json2);

}

以上是 Jackson用spring的接口列表反序列化对象 的全部内容, 来源链接: utcz.com/qa/412912.html

回到顶部