Расширение контроля над объектом @RequestBody Entity при создании/обновлении записи.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Расширение контроля над объектом @RequestBody Entity при создании/обновлении записи.

Сообщение Anonymous »

Я перехожу на Java/Spring из другого стека разработки, и меня очень сбивает с толку то, как в Spring выполняются некоторые вещи.
Одна из проблем — волшебное преобразование параметров тела ответа в объект Java (сущность) с аннотацией @RequestBody.
См. следующий пример

Код: Выделить всё

@PostMapping
public User create(@RequestBody User user) {}

@PutMapping
public User update(@RequestBody User user) {}
Проблема в том, что я не могу контролировать, какие параметры поступают из запроса, а значит, как создается сущность User.
Пользователь Объект может иметь множество полей и ассоциаций, например

Код: Выделить всё

    {
"name": "John Doe",
"age": 33,
"email": "john@example.com",
"addresses": [{
"street": "XYZ Main St",
"city": "Test City",
"zip": "12345"
}]
}
Что, если я хочу иметь конечную точку создания/обновления, которая может задавать/изменять только имя и возраст, а не другие поля и ассоциации?
В то же время мне может понадобиться еще один контроллер для администраторов, который сможет устанавливать/изменять все поля и ассоциации пользователя, показанные выше.
Как могу ли я контролировать, что поступает в тело запроса и как отображается запись пользователя инициализировано?

Я знаю, что могу использовать такие вещи, как UserDto:

Код: Выделить всё

public class UserDTO {
private String name;
private Integer age;
}

// Controller
@PostMapping
public User create(@RequestBody UserDto userDto) {}
Но как объединить этот подход с аннотациями, связанными с @Valid (и другими), которые определены в классе сущности (), поэтому я не могу выполнить проверку таким способом: create(@Valid @RequestBody UserDto userDto).
Или мне следует определить правила проверки, а также поле наборы в DTO?
И следует ли мне создавать DTO для всех возможных конечных точек и бизнес-кейсов, например

Код: Выделить всё

public class UserDTO {
private String name;
private Integer age;
}

public class AdminUserDTO {
private String name;
private Integer age;
private String email;

private List addresses;
}
По моему опыту, хорошим решением было бы получить все параметры запроса «как есть» (возможно, как HashMap) и инициализировать новый объект (или изменить существующий). сущность) явно для того, чтобы иметь полный контроль. Опять же, как использовать @Valid в этом случае?
Пожалуйста, помогите!

Подробнее здесь: https://stackoverflow.com/questions/793 ... dating-a-r
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»