Spring MVC возвращает JSONS и обработку исключений - PullRequest
7 голосов
/ 22 марта 2011

Я использую Spring MVC с контроллерами, мой вопрос заключается в том, как вернуть ответ JSON, отличный от объекта @ResponseBody, который возвращается и преобразуется в возвращаемый JSON.

Более подробно, у меня есть объект с именем "UserDetails", который имеет два поля с именем "name", "emailAddress"

@ResponseBody UserDetails

теперь вернувшийся json будет выглядеть как

{name: "TheUsersName", адрес электронной почты: "abc@abc123.com"}

Есть ли способ, которым я могу изменить json перед возвратом (ВСЕ jsons во всех методах на всех контроллерах), где будет добавлено поле «status», а другие данные json будут находиться под ключом «data» в json.

Также, как мне вернуть json во внешний интерфейс, когда java-сервер откуда-то выдает исключение, json должен иметь «status: false» и имя исключения (хотя бы часть статуса)

Ответы [ 3 ]

14 голосов
/ 22 марта 2011

Создать класс ответа:

public class Response<T> {
    T data;
    boolean status = true;

    public Response(T d) { data = d; }
}

Затем верните это из ваших контроллеров:

@ResponseBody public Response getUserDetails) {
    //...
    return new Response(userDetails);
}

За исключением того, что вы захотите вернуть объект, подобный:

public class BadStatus {
    String errorMessage;
    boolean status = false;

    public BadStatus(String msg) { errorMessage = msg; }
}

@ExceptionHandler(Exception.class)
public BadStatus handleException(Exception ex, HttpServletRequest request) {
  return new BadStatus(ex.getMessage());
}
2 голосов
/ 15 июня 2012

Альтернативное решение (работает с пружиной 3.1), которое менее инвазивно

в вашей конфигурации пружины:

<bean id="jacksonConverter"     class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="mypackage.MyMessageConverter"
            p:delegate-ref="jacksonConverter">
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

Идея состоит в том, чтобы предоставить свой собственный HttpMessageConverter, который делегирует предоставленныйконвертер Джексона.

public class MyMessageConverter implements HttpMessageConverter<Object> {
// setters and delegating overrides ommitted for brevity
@Override
    public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException,
            HttpMessageNotWritableException {
// t is whatever your @ResponseBody annotated methods return
        MyPojoWrapper response = new MyPojoWrapper(t);

        delegate.write(response, contentType, outputMessage);
    }
}

Таким образом, все ваши pojos обернуты каким-то другим json, который вы там предоставили.

Для исключений, решение, предложенное ericacm, является самым простым способом (помнитечтобы аннотировать возвращаемый тип 'BadStatus' с помощью @ResponseBody).

Предупреждение: ваш сериализированный json BadStatus также проходит через MyMessageConverter, поэтому вы захотите проверить тип объекта в переопределенном методе "write",или MyPojoWrapper справится с этим.

2 голосов
/ 22 марта 2011

Да. Вместо этого верните модель и вид.

public ModelMap getUserDetails() {
    UserDetails userDetails; // get this object from somewhere
    ModelMap map = new ModelMap()(;
    map.addAttribute("data", userDetails);
    map.addAttribute("success", true);
    return map;
}

Чтобы добавить исключение, вы должны сделать то же самое с ключом и success = false.

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