Опустить ModelAttribute из поля зрения
У меня есть приложение для отдыха, которое возвращает JSON / XML. Я использую Джексона и Джаксба для конвертации. Некоторые методы должны принимать строку запроса. Я использовал @ModelAttribute для отображения строки запроса в объект, но это заставляет объект в моем представлении. Я не хочу, чтобы объект появлялся в представлении.
Я думаю, что мне нужно использовать что-то другое, чем @ModelAttribute, но я не могу понять, как сделать привязку, но не изменить вид. Если я опускаю аннотацию @ModelAttribute, объект отображается в виде имени переменной (например, "sourceBundleRequest").
Пример URL:
http://localhost:8080/rest/sourcebundles/?updateDate=20100501&label=urgent
Метод контроллера:
@RequestMapping(value = {"", "/"}, method = RequestMethod.GET)
public String getAll(@ModelAttribute("form") SourceBundleRequest sourceBundleRequest, BindingResult result, ModelMap model) throws ApiException {
// Detect and report errors.
if (result.hasErrors()) {
// (omitted for clarity)
}
// Fetch matching data.
PaginatedResponse<SourceBundle> sourceBundleResponse = null;
try {
int clientId = getRequestClientId();
sourceBundleResponse = sourceBundleService.get(clientId, sourceBundleRequest);
} catch (ApiServiceException e) {
throw new ApiException(ApiErrorType.INTERNAL_ERROR, "sourceBundle fetch failed");
}
// Return the response.
RestResponse<PaginatedResponse> restResponse = new RestResponse<PaginatedResponse>(200, "OK");
restResponse.setData(sourceBundleResponse);
model.addAttribute("resp", restResponse);
// XXX - how do I prevent "form" from appearing in the view?
return "restResponse";
}
Пример вывода:
"form": {
"label": "urgent",
"updateDate": 1272697200000,
"sort": null,
"results": 5,
"skip": 0
},
"resp": {
"code": 200,
"status": "OK",
"data": {
"totalAvailable": 0,
"resultList": [ ]
}
}
Желаемый результат:
"resp": {
"code": 200,
"status": "OK",
"data": {
"totalAvailable": 0,
"resultList": [ ]
}
}
Пропуск @ModelAttribute("форма")
Если я просто опускаю @ModelAttribute("form"), я все равно получаю нежелательный ответ, но входящая форма именуется именем объекта. Ответ выглядит так:
"resp": {
"code": 200,
"status": "OK",
"data": {
"totalAvailable": 0,
"resultList": [ ]
}
},
"sourceBundleRequest": {
"label": "urgent",
"updateDate": 1272697200000,
"sort": null,
"results": 5,
"skip": 0
}
3 ответа
Я почему-то упустил самый очевидный способ исправить это. Я сосредоточился на Атрибутах и забыл, что могу просто изменить базовую Карту.
// Remove the form object from the model map.
model.remove("form");
Может быть немного эффективнее пропустить @ModelAttribute, как предложил Biju, а затем удалить объект sourceBundleRequest. Я подозреваю, что @ModelAttribute имеет некоторые дополнительные издержки.
Вам не нужно аннотировать форму с помощью @ModelAttribute, если вы не хотите, чтобы форма возвращалась в представление, она будет чисто привязана к SourceBundleRequest
даже без аннотации @ModelAttribute.
Теперь стандартный способ возврата ответа JSON/XML с использованием Spring MVC - это прямой возврат типа (в вашем случае PaginatedResponse
) и затем аннотируйте метод @ResponseBody
, базовый HttpMessageConverter
затем преобразовал бы ответ в XML/JSON на основе заголовка Accept от клиента.
@ResponseBody
public RestResponse<PaginatedResponse> getAll(SourceBundleRequest sourceBundleRequest, BindingResult result, ModelMap model)
...
Как насчет использования @JsonIgnore?
@ModelAttribute("foo")
@JsonIgnore
public Bar getBar(){}
Не проверял это