2012-04-25 4 views
2

Привет Я пытаюсь использовать jackson для сериализации и десериализации класса (SimpleExpression) с защищенным конструктором. Когда я использую gson, у меня нет никаких проблем для этого, но кажется, что Jackson не может обрабатывать защищенные конструкторы. Я пробовал использовать mixin-аннотации, но не работал. Сериализация работает без проблем. Джексон бросает:Deserialize защищенный конструктор с Jackson

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type 

Любая помощь? Мой код:

private static SimpleExpression create(String json) throws JsonParseException, JsonMappingException, IOException 
{ 
    ObjectMapper mapper = new ObjectMapper().setVisibility(PropertyAccessor.ALL, Visibility.ANY); 
    SimpleExpression sp = null; 
    sp = mapper.readValue(json, SimpleExpression.class); 
    return sp; 
} 

SimpleExpression класс, я Omiting сорбент и сеттеры.

public class SimpleExpression implements Criterion 
{ 
private static final long serialVersionUID = 1L; 

private final String propertyName; 

private final Object value; 

private boolean ignoreCase; 

private final String op; 

private final String type; 

protected SimpleExpression(String propertyName, Object value, String op) 
{ 
    this.propertyName = propertyName; 
    this.value = value; 
    this.op = op; 
    this.type = value.getClass().getName(); 
} 

protected SimpleExpression(String propertyName, Object value, String op, boolean ignoreCase) 
{ 
    this.propertyName = propertyName; 
    this.value = value; 
    this.ignoreCase = ignoreCase; 
    this.op = op; 
    this.type = value.getClass().getName(); 
} 
} 
+0

Вы должны включать в себя класс размораживание из 'SimpleExpression', так как это то, что что-то не хватает. – StaxMan

+0

Я забыл об этом, просто сделал. –

ответ

3

Защищенная часть не должна быть проблематичной (они найдены нормально), но, возможно, конструктор принимает аргументы. Чтобы указать конструктор, не используемый по умолчанию, вы используете @JsonCreator; но кроме того, это зависит от того, какой конструктор (или статический заводский метод) использовать.

Чтобы узнать подробности, требуется определение класса. Другая возможность заключается в том, что вы пытаетесь справиться с нестационарным внутренним классом.

+0

Да, он принимает аргументы, но если у меня нет доступа к конструктору классов, из библиотеки я не могу его аннотировать, не так ли? Итак, чтобы перестроить объект, мне нужно аннотировать конструктор, без чего Джексон попытается использовать конструктор no-arg? –

+0

Исправлено, без аннотаций Джексон не может понять другие ctors (поскольку имена параметров ctor не хранятся в байте-коде). Но вы все равно можете использовать аннотации микширования, см. [Http://wiki.fasterxml.com/JacksonMixInAnnotations] даже для конструкторов (а не только для методов или полей). – StaxMan

+0

Аннотации Wrt mix-in: тогда вы просто определяете фиктивный класс с соответствующим конструктором (те же типы аргументов в том же порядке); отметьте это с помощью '@ JsonCreator' и каждый параметр с' @ JsonProperty', который указывает, какое имя JSON соответствует ему. Это должно сработать, как только вы зарегистрируете аннотацию микширования для 'ObjectMapper' – StaxMan

0

Просто, если any1 подходит к теме. У меня была такая же проблема. Я просто добавить конструктор

protected SimpleExpression(){} 

и он работал отлично

+0

Это не будет компилироваться, поскольку последние атрибуты не инициализируются. Он будет работать, если вы явно установите для каждого атрибута значение null или значение по умолчанию. –

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