Сглаживание полей в запросе

#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