Пишу 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
Сборка персонального компьютера от Artline: умный выбор для современных пользователей