MappingJacksonJsonView: игнорировать поля без использования @JsonIgnore - PullRequest
4 голосов
/ 02 августа 2011

Мне нужно игнорировать некоторые поля в POJO, потому что они загружаются лениво и / или, в некоторых случаях, создают бесконечную рекурсию (Parent один-ко-многим Childs, Child много-к-одному Parent).Мой POJO находится в другом банке, который ничего не знает о Джексоне, JSON и т. Д.

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

Спасибо

Ответы [ 2 ]

6 голосов
/ 02 августа 2011

Вы можете написать пользовательский сериализатор и десериализатор с Java-кодом, например:

class CustomSerializer extends JsonSerializer<ARow> {
@Override
public Class<ARow> handledType() {
    return ARow.class;
}

public void serialize(ARow value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException, JsonProcessingException {
    jgen.writeStartObject();
    jgen.writeStringField("ounc", value.ounces.toLowerCase()); //Do this for all of your relevant properties..
    jgen.writeEndObject();
}

}

и зарегистрировать этот пользовательский сериализатор с Джексоном:

ObjectMapper m = new ObjectMapper();
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null));
testModule.addSerializer(new CustomSerializer());
m.registerModule(testModule);

Чтобы настроить это с помощью Spring's MappingJacksonJsonView, вам нужно расширить собственный ObjectMapper

public class MyCustomObjectMapper extends ObjectMapper {
    public MyCustomObjectMapper() {
        SimpleModule module = new SimpleModule("My Module", new Version(1, 0, 0, "SNAPSHOT"));
        module.addSerializer(new CustomSerializer());
        module.addSerializer(new CustomSerializer2());
        // etc
        this.registerModule(module);
    }
}

Создайте для него боб

<bean id="myCustomObjectMapper" class="com.foo.proj.objectmapper.MyCustomObjectMapper"/>

И впрысни его в свой MappingJacksonJsonView

<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
    <property name="objectMapper" ref="myCustomObjectMapper"/>
</bean>
3 голосов
/ 03 августа 2011

Помимо пользовательских обработчиков, которые были предложены (и которые будут работать), вы также можете взглянуть на смешанные аннотации (или на этой вики-странице ). С ними вы можете использовать не только @JsonIgnore, но и @ JsonManagedReference / @ JsonBackReference, которые предназначены для сохранения отношений один-к-одному и один-ко-многим (игнорируются при сериализации, но повторно подключаются при десериализации!)

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