У меня есть модель , описанная следующим образом:
@Table
@Entity
@Data
@Builder
@ToString
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class User {
// ...skipped...
private String foo;
}
У меня также есть служба с методом, который создает новую сущность:
@Service
public class UserService {
// ...skipped...
public User createUser(User user) {
Date currentDate = new Date();
user.setCreated(currentDate);
userRepository.save(user);
return user;
}
}
У меня также есть контроллер и сопоставленный метод:
@Controller
@RequestMapping(UserRouteRegistry.FIRST_LEVEL + "/*")
public class UserController {
// ...skipped...
@PostMapping(UserRouteRegistry.SIGN_UP)
public String signUp(
@ModelAttribute("user") @Validated(User.CreateUserGroup.class) User user,
BindingResult result,
WebRequest request,
RedirectAttributes redirectAttributes
) {
// ...mercellessly skipped...
userRegistered = userService.createUser(user);
// ...mercellessly skipped...
}
Все довольно просто, верно?
У меня нетполе foo
в веб-форме, и мне НЕ нужен веб-пользователь для установки этого поля, это должно быть какое-то действительно приватное поле, на которое НЕ должен напрямую влиять веб-пользователь.
КогдаЯ делаю собственный запрос POST, я вижу, что создается новый объект с полем foo
, заполненным данными, которые были установлены в запросе:
POST /user/sign-up HTTP/1.1
Host: 127.0.0.1:8080
Origin: http://127.0.0.1:8080
Content-Type: application/x-www-form-urlencoded
Referer: http://127.0.0.1:8080/user/sign-up
Cookie: SL_G_WPT_TO=ru; SL_GWPT_Show_Hide_tmp=1; SL_wptGlobTipTmp=1; BL_D_PROV=; BL_T_PROV=; JSESSIONID=E1190293BD183C647245BAE03E6DCDDA
cache-control: no-cache
Postman-Token: e572bccf-ff0a-4b0b-a181-dd0aa20dca99
foo=13
> SELECT foo FROM user ORDER BY id DESC LIMIT 1 \G
*************************** 1. row ***************************
foo: 13
1 row in set (0.0005 sec)
Да, это выглядит довольноправильно, но какой способ предотвратить что-нибудь?
Назначение "приватным" полям значения null
на уровне service level?Это было бы довольно утомительно, но это сработало бы.Установка некоторого @annotation (кстати, какая аннотация должна быть?) Для этого поля на уровне model ?Я не уверен, что это было бы логично, по моему мнению.Фильтрация параметров на уровне контроллера , где-то перечислены все разрешенные параметры?Может быть, так?
Как правильно?
Спасибо!