2016-12-04 6 views
0

Ich habe ein unveränderliches Objekt SimpleGrantedAuthority von Feder, die keinen Argon-Konstruktor hat. Stattdessen ist es ein unveränderliches Objekt mit nur 1 einzigen arg Konstruktor wie folgt aus:Konfigurieren Sie Jackson für die Verwendung von Single-Arg-Konstruktor

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

Ich versuche, eine Zeichenfolge zu diesem Objekt deserialisieren, und ich habe keinen Zugriff auf den Quellcode dieser Datei. Hier ist die Ausnahme, die ich erhalten:

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) 

Wie ich schon sagte, ich nicht den Quellcode haben und ich kann die @JsonCreator Annotation nicht hinzufügen, so frage ich mich, wie jackson konfigurieren die richtige Konstruktor zu verstehen, zu nutzen. Etwas in etwas wie:

Module module = new SimpleModule("MyModule") { 

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

Danke

EDIT

habe ich versucht, den Vorschlag von Shashank so habe ich diese Klasse:

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

und dann registriert ich es so:

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); 

aber ich sehe immer noch die gleiche Ausnahme.

Antwort

2

Sie müssen mixin verwenden, die alle jackson-Metadaten zur Verfügung stellen, ohne die tatsächliche pojo zu ändern.

Third Party Klasse:

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 + 
      '}'; 
    } 

} 

Mixin in Sie Code:

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

konfigurieren Mapper:

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

Lesewert:

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

Ich hoffe, das hilft.

EDITED Freigabe vollständiger Code:

Abstrakte Klasse

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

}

konkrete Umsetzung

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 + 
      '}'; 
} 

} 

mit mixin

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) { } 
} 

Ausgabe

null 
class Mixin 
SingleArgConstructor{n=10} 

Process finished with exit code 0 
+0

Vielen Dank - ich habe es versucht, aber es funktioniert nicht :( –

+0

Aktienemission/Ausnahme – Shashank

+0

Es sollte aktualisierten Code arbeiten, um es versuchen, auch Donot Sie 'Kontext brauchen .setMixInAnnotations (SimpleGrantedAuthority.class, SimpleGrantedAuthorityMixIn.class); 'Auch sagen Sie mir, welche Version von Jaackon Sie verwenden – Shashank

Verwandte Themen