2016-12-04 5 views
0

У меня есть неизменный объект SimpleGrantedAuthority с весны, у которого нет конструктора no-arg. Вместо этого он непреложный объект только один сингл-Arg конструктора так:Настроить jackson для использования конструктора с одним аргументом

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

Спасибо

EDIT

Я попытался внушение Shashank, так что я создал этот класс:

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

} 

Mixin в вас код:

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

Настройка картографа:

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

Reading значение:

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

Надеюсь, это поможет.

EDITED Sharing полный код:

Абстрактный класс

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

} 

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

Выход

null 
class Mixin 
SingleArgConstructor{n=10} 

Process finished with exit code 0 
+0

Спасибо - я пробовал, но он не работает :( –

+0

Эмиссионный/исключение – Shashank

+0

Он должен работать, обновленный код попробовать, и вы выигрыш нужно 'контекст .setMixInAnnotations (SimpleGrantedAuthority.class, SimpleGrantedAuthorityMixIn.class); 'Также скажите мне, какую версию jaackon вы используете – Shashank

Смежные вопросы