Как ограничить поля, которые отображаются в @RequestBody - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь реализовать очень простое веб-приложение Spring Boot. Так как я сопоставляю объект JSON с сущностью (говорит «Сущность клиента») с помощью метода @RequestBody.

В addCustomer , я хочу связать / отобразить только поля firstName & lastName и игнорируйте поле Id , даже если в ответе JSON клиента есть это поле.

И в updateCustomer метод Iнеобходимо сопоставить все поля, включая Id , потому что мне нужно поле Id для обновления сущности.

Как можно игнорировать некоторые или одно поле в процессе автоматического сопоставления@RequestBody.

@RestController
@RequestMapping("/customer-service")
public class CustomerController {
    @Autowired
    CustomerServiceImpl customerService; 

    //This method has to ignore "id" field in mapping to newCustomer
    @PostMapping(path = "/addCustomer")
    public void addCustomer(@RequestBody Customer newCustomer) {
        customerService.saveCustomer(newCustomer);
    }

    //This method has to include "id" field as well to updatedCustomer
    @PostMapping(path = "/updateCustomer")
    public void updateCustomer(@RequestBody Customer updatedCustomer) {
        customerService.updateCustomer(updatedCustomer);
    }
}
@Entity
@Table(name = "CUSTOMER")
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long cusId;

    private String firstName;
    private String lastName;

    //Default Constructor and getter-setter methods after here
}

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Вы можете использовать несколько @JsonView s, чтобы использовать разные отображения в каждом методе.

  1. Определение видов:
public class Views {
    public static class Create {
    }
}
Выберите, какие поля следует использовать в каждом представлении:
@Entity
@Table(name = "CUSTOMER")
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long cusId;

    @JsonView(Views.Create.class)
    private String firstName;
    @JsonView(Views.Create.class)
    private String lastName;
    ...
}
Скажите Spring MVC использовать это представление в конкретном методе:
@PostMapping(path = "/addCustomer")
public void addCustomer(@RequestBody @JsonView(Views.Create.class) Customer newCustomer) {
    customerService.saveCustomer(newCustomer);
}
0 голосов
/ 23 октября 2019

TL; DR: используйте одно из следующего:

  • @JsonIgnoreProperties("fieldname") в вашем классе.
  • @JsonIgnore в вашем поле, чтобы игнорировать его отображение.

Пример:

@Getter
@Setter
@JsonIgnoreProperties("custId")
public class Customer {

@JsonIgnore
private String custId;
private String firstName;
private String lastName;

}

НО, поскольку у вас один и тот же POJO, он пропустит отображение "custId" для обоих запросов.

AFAIK, вам не следуетполучение значения custId для вашего @PostMapping (добавление клиента), поэтому для него будет динамически установлено значение NULL или значение по умолчанию. И при создании пользователя вы должны также создать для него идентификатор или позволить базе данных позаботиться об этом.

А для @PutMapping (обновление пользователя) вы должны получить значение идентификатора, которое можно использовать для идентификации пользователя. а затем сделать обновление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...