2016-12-04 36 views
0

我有從彈簧不可變對象SimpleGrantedAuthority不具有一個無參數構造。相反,它是一個只有1單參數的構造類似這樣的不可變對象:配置傑克遜使用單個參數構造

public SimpleGrantedAuthority(String role) { 
    Assert.hasText(role, "A granted authority textual representation is required"); 
    this.role = role; 
} 

我試圖反序列化一個字符串到該對象和我沒有訪問此文件的源代碼。這裏是例外,我得到:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of org.springframework.security.core.authority.SimpleGrantedAuthority: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?) 
at [Source: [email protected]; line: 7, column: 7] (through reference chain: com.nemesis.platform.facade.email.data.EnrichedEmailMessageContextData["customer"]->com.nemesis.platform.facade.user.data.EnrichedUserDetails["authorities"]->java.util.ArrayList[0]) 
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270) 
at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456) 

就像我說的,我沒有源代碼,我不能添加@JsonCreator註解,所以我不知道如何配置傑克遜瞭解正確的構造器使用。東西的喜歡:

Module module = new SimpleModule("MyModule") { 

     @Override 
     public void setupModule(Module.SetupContext context) { 
      context.addAbstractTypeResolver(new SimpleAbstractTypeResolver().addMapping(GrantedAuthority.class, SimpleGrantedAuthority.class)); 
     } 
    }; 

謝謝

編輯

我試過沙善的建議,所以我創建了這個類:

abstract class SimpleGrantedAuthorityMixIn { 
    @JsonCreator 
    SimpleGrantedAuthorityMixIn(@JsonProperty("authority") String authority) { 
    } 
} 

,然後我註冊它像這樣:

Module module = new SimpleModule("SamplestoreModule") { 

     @Override 
     public void setupModule(Module.SetupContext context) { 
      context.addAbstractTypeResolver(new SimpleAbstractTypeResolver().addMapping(GrantedAuthority.class, SimpleGrantedAuthority.class)); 
      context.setMixInAnnotations(SimpleGrantedAuthority.class, SimpleGrantedAuthorityMixIn.class); 
     } 
    }; 

    objectMapper.registerModule(module); 
    objectMapper.addMixIn(SimpleGrantedAuthority.class, SimpleGrantedAuthorityMixIn.class); 

但我仍然看到相同的例外。

回答

2

您需要使用mixin將提供所有元數據傑克遜而不需要修改實際的POJO。

第三方類:

public class SingleArgConstructor { 
    public int getN() { 
    return n; 
    } 
    int n; 

    public SingleArgConstructor(int n) { 
     this.n = n; 
    } 

    @Override 
    public String toString() { 
     return "SingleArgConstructor{" + 
      "n=" + n + 
      '}'; 
    } 

} 

密新在你的代碼:

abstract class MixIn { 
    @JsonCreator 
    MixIn(@JsonProperty("n") int n) { } 
} 

配置映射:

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.addMixIn(SingleArgConstructor.class,MixIn.class); 

讀數值:

System.out.println(objectMapper.readValue("{\"n\":10}",SingleArgConstructor.class)); 

我希望這有助於。

EDITED 共享的完整代碼:

抽象類

/** 
* Created by shashankt on 6/12/16. 
*/ 
public abstract class AbstractArgsConstructor { 
    int n; 
    public AbstractArgsConstructor(int n) { 
     this.n = n; 
    } 

}

具體實現

import com.fasterxml.jackson.databind.Module; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.module.SimpleAbstractTypeResolver; 
import com.fasterxml.jackson.databind.module.SimpleModule; 

import java.io.IOException; 

/** 
* Created by shashankt on 4/12/16. 
*/ 
public class SingleArgConstructor extends AbstractArgsConstructor{ 
public SingleArgConstructor(int n) { 
    super(n); 
} 

public int getN() { 
    return n; 
} 




public static void main(String[] args) throws IOException { 
    Module module = new SimpleModule("SamplestoreModule") { 

     @Override 
     public void setupModule(Module.SetupContext context) { 
      context.addAbstractTypeResolver(new SimpleAbstractTypeResolver().addMapping(AbstractArgsConstructor.class, SingleArgConstructor.class)); 
     } 
    }; 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.registerModule(module); 
    objectMapper.addMixIn(SingleArgConstructor.class,Mixin.class); 
     System.out.println(objectMapper.getDeserializationConfig().findMixInClassFor(AbstractArgsConstructor.class)); 
     System.out.println(objectMapper.getDeserializationConfig().findMixInClassFor(SingleArgConstructor.class)); 

    SingleArgConstructor pojo = new SingleArgConstructor(10); 
    System.out.println(objectMapper.readValue(" {\"p\":10}",AbstractArgsConstructor.class)); 
    } 

@Override 
public String toString() { 
    return "SingleArgConstructor{" + 
      "n=" + n + 
      '}'; 
} 

} 

與混入

import com.fasterxml.jackson.annotation.JsonCreator; 
import com.fasterxml.jackson.annotation.JsonProperty; 

/** 
* Created by shashankt on 4/12/16. 
*/ 

abstract class Mixin { 
    @JsonCreator 
    Mixin(@JsonProperty("p") int n) { } 
} 

輸出

null 
class Mixin 
SingleArgConstructor{n=10} 

Process finished with exit code 0 
+0

謝謝你 - 我已經試過了,但它不工作:( –

+0

股票發行/異常 – Shashank

+0

它應該工作,更新的代碼試試吧,你也需要DONOT背景下' .setMixInAnnotations(SimpleGrantedAuthority.class,SimpleGrantedAuthorityMixIn.class);'也告訴我你正在使用哪個版本的jaackon – Shashank