#java #spring-boot #spring-mvc #controller
Вопрос:
У меня есть простая просьба:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Request
{
private Address address;
private Name name;
}
где Address
и Name
:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Address
{
private String postalCode;
private String city;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Name
{
private String firstName;
private String lastName;
}
и простой контроллер:
@RestController
public class Controller
{
@PostMapping(path = "data", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> post(@RequestBody Request request)
{
return ResponseEntity.ok("1234");
}
}
Чтобы сделать запрос, я должен использовать почтальона с телом запроса, например:
{
"address": {
"postalCode":"aaaa",
"city":"bbb"
},
"name": {
"firstName": "tom",
"lastName": "xyz"
}
}
И мой вопрос: есть ли какой-либо способ «сгладить» этот запрос до простых атрибутов:
{
"city":"bbb"
"postalCode":"aaaa",
"firstName": "tom",
"lastName": "xyz"
}
Ответ №1:
Аннотируйте @JsonUnwrapped
поля address
и name
в своем Request
классе:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class Request
{
@JsonUnwrapped
private Address address;
@JsonUnwrapped
private Name name;
}
Вот небольшой образец кода:
Сначала сериализуйте запрос в строку json:
ObjectMapper mapper = new ObjectMapper();
Address address = new Address("123435", "Athens");
Name name = new Name("John", "Doe");
Request request = new Request(address, name);
String s = mapper.writeValueAsString(request);
System.out.println(s);
Вывод на консоль:
{"postalCode":"123435","city":"Athens","firstName":"John","lastName":"Doe"}
А затем десериализуйте строку json для запроса объекта:
Request request1 = mapper.readValue("{"postalCode":"12345","city":"Athens","firstName":"John","lastName":"Doe"}", Request.class);
System.out.println(request1.getAddress().getPostalCode());
System.out.println(request1.getAddress().getCity());
System.out.println(request1.getName().getFirstName());
System.out.println(request1.getName().getLastName());
и вывод на консоль:
12345
Athens
John
Doe