Пишу spring mvc. Для отправки json использую view (id, name, phone) и jackson. После выполнения запроса в service (например, после save) нужно отправить пользователю результат вида {"data":{"id":1}}
. Либо {"data":{"result":"success"}}
. В общем что-то в data. Это может быть набор параметров. Наверняка есть какая-нибудь аннотация для класса, которая указывает на класс-обёртку, формирующего в data нужный результат? Буду благодарен за подсказку или ссылку. В интернете гугглил, но мало что понял
model Users
@Entity
@Table(name = "Users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
/**
* Иия
*/
@Basic(optional = false)
@Column(name = "name")
private String Name;
@Basic(optional = false)
@Column(name = "phone")
private String phone;
/*...getter, setter...*/
}
view UserView
@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserView {
@ApiModelProperty
public Long id;
public String Name;
public String phone;
}
controller UserController
@RestController
@RequestMapping(value = "/api/user", produces = APPLICATION_JSON_VALUE)
@Api(value = "UserControllerAPI")
public class UserController {
/*...service т.д....*/
@ApiOperation(value = "addUser", nickname = "addUser", httpMethod = "POST")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Success",
response = User.class),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 500, message = "Failure")})
@RequestMapping(value = "/save", method = {POST})
public void addUser(@RequestBody UserView userView) {
userService.save(userView);
}
}
При запросе "Jackson wrapper object" выдает первой же ссылкой.
Вам нужна аннотация @JsonRootName
. Копирую оттуда пример, чтобы ответ был более полным:
Пишем так:
@JsonRootName(value = "User")
public class UserWithRoot {
public int id;
public String name;
}
Тогда вместо такого:
{
"id": 1,
"name": "John"
}
Мы получим это:
{
"User": {
"id": 1,
"name": "John"
}
}
Если я правильно понял вопрос, то это то, что вам нужно.
Помог @ControllerAdvice
Сделал так:
@ControllerAdvice
public class JSONResponseWrapper implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@Override
@SuppressWarnings("unchecked")
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof List) {
return new Wrapper<>((List<Object>) body);
}
return new WrapperObj<Object>(body);
}
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
@JsonSerialize
private class Wrapper<T> {
private final List<T> data;
public Wrapper(List<T> data) {
this.data = data;
}
}
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
@JsonSerialize
private class WrapperObj<T> {
private final Object data;
public WrapperObj(Object data) {
this.data = data;
}
}
}
И теперь return объекта или коллекции объектов в любом контроллере проекта оборачивается в Data.
Тем не менее спасибо Uraty за полезную информацию. Буду знать про аннотацию @JsonRootName
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Что такое объектный модуль? Это что-то вроде скомпилированного java файла?
Ребят подскажите какой конфиг ставить, чтобы запустить jar после обфускации? Использую proguard gui, вроде все проходит без ошибок, но jar на выходе...
Использую библиотеку Isotope для отображения и фильтрации элементов с изображениями на странице
Как сделать так чтобы при создании нового элемента в него переносиля фокус?