Использование @JsonView с Spring MVC - PullRequest
8 голосов
/ 24 апреля 2011

Я использую следующее определение компонента, чтобы заставить мое весеннее приложение говорить в формате JSON

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />

Возможно ли с этим компонентом конвертера сообщений использовать аннотацию @JsonView?

Ответы [ 2 ]

18 голосов
/ 26 апреля 2011

@JsonView уже поддерживается в процессоре Jackson JSON начиная с версии 1.4.

Новое редактирование: Обновлено для Джексона 1.9.12

В соответствии с v1.8.4 документацией функция, которую я использовал writeValueUsingView, теперь устарела Вместо этого используйте ObjectMapper.viewWriter (java.lang.Class) & hellip; однако это также было устарело Начиная с версии 1.9, используйте writerWithView (Class) вместо ! (см. v1.9.9 документация )

Итак, вот обновленный пример, протестированный с Spring 3.2.0 и Jackson 1.9.12, который просто возвращает {id: 1}, а не расширенный {name: "name"}, поскольку он использует .writerWithView(Views.Public.class). Переключение на Views.ExtendPublic.class приведет к {"id":1,"name":"name"}

package com.demo.app;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import org.codehaus.jackson.map.annotate.JsonView;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

@Controller
public class DemoController {
    private final ObjectMapper objectMapper = new ObjectMapper();

    @RequestMapping(value="/jsonOutput")
    @ResponseBody
    public String myObject(HttpServletResponse response) throws IOException {
        ObjectWriter objectWriter = objectMapper.writerWithView(Views.Public.class);
        return objectWriter.writeValueAsString(new MyObject());
    }

    public static class Views {
        static class Public {}
        static class ExtendPublic extends Public {}
    }

    public class MyObject {
        @JsonView(Views.Public.class) Integer id = 1;
        @JsonView(Views.ExtendPublic.class) String name = "name";
    }
}

Предыдущее редактирование: Вам нужно создать экземпляр ObjectMapper и выписать объект, используя пользовательское представление, как показано здесь , или в этом примере:

Определить виды:

class Views {
    static class Public {}
    static class ExtendedPublic extends PublicView {}
    ...
}

public class Thing {
    @JsonView(Views.Public.class) Integer id;
    @JsonView(Views.ExtendPublic.class) String name;
}

Использовать просмотры:

private final ObjectMapper objectMapper = new ObjectMapper();

@RequestMapping(value = "/thing/{id}")
public void getThing(@PathVariable final String id, HttpServletResponse response) {
    Thing thing = new Thing();
    objectMapper.writeValueUsingView(response.getWriter(), thing, Views.ExtendPublic.class);
}

Если вы используете Джексона> = 1.7, вы можете обнаружить, что @JSONFilter лучше соответствует вашим потребностям.

7 голосов
/ 17 июня 2014

@ Аннотация JsonView не поддерживалась в Spring, но эта проблема решена!
Follow this

Добавить поддержку представлений сериализации Jackson

Spring MVC теперь поддерживает представления сериализации Jackon для рендеринга разных подмножеств одного и того же POJO из разных методов контроллера (например, подробная страница против сводного представления).Выпуск: SPR-7156

Это SPR-7156 .

Статус: решен

Описание

Аннотация JSONView Джексона позволяет разработчику контролировать, какие аспекты методасериализуются.В текущей реализации необходимо использовать средство записи представления Джексона, но тогда тип содержимого недоступен.Было бы лучше, если бы в качестве части аннотации RequestBody мог быть указан JSONView.

Доступно для Spring ver> = 4.1

Спасибо, весна!

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