Джексон добавляет избыточные данные в POJO и затем не может их прочитать - PullRequest
4 голосов
/ 17 марта 2011

Я использую Джексона для отправки данных в формате JSON между клиентом и сервером.Я пытаюсь использовать функцию полного связывания Джексона и применяю ее поверх стандартного POJO.Проблема в том, что Джексон, кажется, добавляет избыточные данные во время маршалинга на сервере, поэтому, когда я пытаюсь восстановить его обратно в POJO на стороне клиента, я получаю сообщение об ошибке.

Вот выдержка из строки Джексона:

{"_ class": "com.mycoomp.MyObject", "_ id": {"time": 1300314145000, "new": false, "machine": 1652794940, "inc": - 510750341}, "language": "", "type" .....

MyObject содержит «language» и «type», но не содержит «time», «new» и «machine», которыене являются частью этого, но на стороне клиента я получаю эту ошибку:

нераспознанное поле "время" (класс org.bson.types.ObjectId), не помеченное как игнорируемое в [Source: java.io.StringReader @ 1c56c60;строка: 1, столбец: 102] (через цепочку ссылок: com.mycomp.MyObject ["_ id"] -> org.bson.types.ObjectId ["time"])

Есть идеи ...?

Ответы [ 3 ]

2 голосов
/ 02 марта 2014

Решение состоит в том, чтобы предоставить пользовательский сериализатор / десериализатор для ObjectId:

public class ObjectIdMapping {
    public static class ObjectIdSerializer extends JsonSerializer<ObjectId>{
        @Override
        public void serialize(ObjectId  id, JsonGenerator json,
                SerializerProvider provider) throws IOException,
                JsonProcessingException {
            json.writeString(id.toString());

        }
    }
    public static class ObjectIdDeerializer extends JsonDeserializer<ObjectId>{
        @Override
        public ObjectId deserialize(JsonParser jp, DeserializationContext context)
                throws IOException, JsonProcessingException {
            if (!ObjectId.isValid(jp.getText())) throw context.mappingException("invalid ObjectId " + jp.getText());
            return new ObjectId(jp.getText());
        }
    }
}   

и зарегистрировать их как любой из методов, описанных в документации .Например, добавьте в свой POJO:

@JsonSerialize(using = ObjectIdMapping.ObjectIdSerializer.class)
@JsonDeserialize(using = ObjectIdMapping.ObjectIdDeerializer.class)
public ObjectId od;
1 голос
/ 22 мая 2012

Я только что столкнулся с этим, поскольку у меня была такая же проблема. Похоже, работа для Монго-Джексон-маппер

Я бы также посоветовал удалить инфраструктурные классы, такие как ObjectId, из вашего домена.

1 голос
/ 17 марта 2011

Вам необходимо дать определения типов для сериализуемых типов.Джексон не добавляет никаких записей, которые нельзя обнаружить из объектов (через геттеры, открытые поля или явно аннотированные);за исключением случаев, когда вы добавляете аннотацию @JsonTypeInfo для добавления идентификатора типа.

Так, может, сериализуемый объект имеет больше открытых полей, которые будут сериализованы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...