控制結構 順序 程式從上到下逐行地執行,中間沒有任何判斷和跳轉。 順序控制舉例和註意事項 Java中定義成員變數時採用合法的前向引用。如: public class Test{ int num1 = 12; int num2 = num1 + 2; } 錯誤形式: public class ...
在Spring Security框架中,UserDetails類是個關鍵用戶信息類,但其中的authorities屬性是GrantedAuthority類型,該類型沒有預設的無參構造函數,無法直接使用FastJson進行反序列化。
一旦使用了Redis存儲用戶的UserDetails信息,且Redis的Value序列化方法使用的FastJson的序列化,那麼在反序列化時,就會報錯“default constructor not found. class org.springframework.security.core.authority”
。
GrantedAuthority
介面的預設實現類 SimpleGrantedAuthority
還是final類型,無法編寫子類,我們重新一個類又太麻煩了。
在不改變我們使用框架的前提下,秉著儘量少改動的原則,那麼只有讓FastJson支持GrantedAuthority的反序列化。
我們知道,FastJson的反序列化是基於類的無參構造函數,new一個類的實例,然後使用getter和setter方法對每個屬性賦值。
如何讓FastJson支持沒有無參構造函數的類呢,那就是自己實現GrantedAuthority的反序列化代碼,替代預設實現。
自己實現GrantedAuthority的反序列化類如下,該方法同樣適用於其他沒有無參構造函數的類
/**
* FastJson——自己實現SimpleGrantedAuthority類的反序列化方法。
*/
public class SimpleGrantedAuthorityDeserializer implements ObjectDeserializer {
@Override
public SimpleGrantedAuthority deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
JSONObject jsonObject = parser.parseObject();
String authority = Convert.toStr(jsonObject.get("authority"));
return new SimpleGrantedAuthority(authority);
}
@Override
public int getFastMatchToken() {
return 0;
}
}
在初始FastJson的配置類中,配置SimpleGrantedAuthority的反序列化方法為SimpleGrantedAuthorityDeserializer,代碼如下:
ParserConfig.getGlobalInstance().putDeserializer(SimpleGrantedAuthority.class,new SimpleGrantedAuthorityDeserializer());
如此,就可以繼續實現業務邏輯了。