2016-02-08 3 views
0

У меня есть много классов DTO i мой проект, который сериализуется для json, который будет использоваться для конечных точек отдыха. Все расширяются (прямые или косвенные) абстрактный класс «Linkable», который содержит идентификатор объектов и создает личную ссылку с использованием инъецированного «UriInfo». Чтобы получить эту работу, мне нужно вводить экземпляры DTO. Это все работает нормально.Невозможно сериализовать (json) объект, потому что сваривает ящик прокси «обработчик нераспознанного поля»

В последнее время я создал 2 других DTO, которые имеют дополнительный уровень в иерархии.Проблема заключается в том, что если я пытаюсь внедрить экземпляры этих классов, я получаю прокси (созданный с помощью сварки). Эти прокси содержат дополнительные поля, которые не могут быть сериализованы, потому что они неизвестны (без геттеров или сеттеры): com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "handler"

Так что мой вопрос: Почему создается прокси-сервер, а не сам класс. В качестве обходного пути: могу ли я отметить дополнительные поля, которые нужно каким-то образом игнорировать (прокси-подкласс)?

Вот код части иерархии отличается от рабочих DTOS (CreatedByUserRepresentation расширяет Linkable):

public abstract class VoteRepresentation<T extends CreatedByUserRepresentation> extends CreatedByUserRepresentation{ 

    @NotNull 
    private T voteOf; 

    @Min(-1) // down vote 
    @Max(1) // up vote 
    private int value; 

    @AssertTrue 
    public boolean valueIsNotZero() { 
     return value != 0; 
    } 

    public T getVoteOf() { 
     return voteOf; 
    } 

    public int getValue() { 
     return value; 
    } 

    public void setVoteOf(T voteOf) { 
     this.voteOf = voteOf; 
    } 

    public void setValue(int value) { 
     this.value = value; 
    } 

} 

Фактический класс:

@XmlRootElement(name = "problemvote", namespace = "urn:problems:problemvote") 
public class ProblemVoteRepresentation extends VoteRepresentation<ProblemRepresentation> { 

    @Override 
    protected Class<?> getResourceClass() { 
     return ProblemVoteResource.class; 
    } 
} 

Существует еще одно расширение «VoteRepresentation ». У обоих одинаковая проблема: через cdi я могу получить только экземпляры «прокси» с дополнительными полями, которые не могут быть сериализованы. Было бы достаточно получить некоторые подсказки, почему используется прокси-сервер. Я только читал о сфере охвата. но в этом случае класс, который вводит dto, все «RequestScoped».

ответ

0

Я нашел причину этого нечетного поведения: это аннотация @AssertTrue. Если я удалю его сварку больше не использует прокси и сериализации работает нормально.

Это очень ограничивает использование javax.validation, и я думаю, что это поведение не предназначено ?!

РЕДАКТИРОВАТЬ Martin Kouba gave a good explanation такое поведение вытекает из bean validation spec 10.1.2.

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