У меня есть класс объектов домена User
(это объект JPA):
@Entity
public class User {
private String name;
private boolean enabled = true;
// getters/setters
}
И я пытаюсь предложить REST API, позволяющий клиентам создавать новых пользователей, используя Spring 3 MVC:
@Controller
public class UserController {
@RequestMapping(value="/user", method=RequestMethod.POST)
@ResponseBody
public String createRealm(@RequestBody User user) {
user.setEnabled(true); // client is not allowed to modify this field
userService.createUser(user);
...
}
}
Это прекрасно работает, но я не знаю, стоит ли использовать доменные объекты как @ RequestBody , потому что мне нужно защищать некоторые поля, которые не должныбыть непосредственно измененным клиентом (то есть «включено» в данном случае).
Каковы плюсы / минусы этих альтернатив:
- Использование объектов домена и защищать поля, которые пользователь не может изменять (например, установить для них значение null или значение по умолчанию вручную)
- Использовать новый набор дополнительных объектов (что-то похожее наDTO), например UserRequest, который содержит только поля, которые я хочу предоставить через API REST, и сопоставить их (т. е. с Dozer ) с объектами домена.
Второй вариант выглядит так:
@Entity
public class User {
private String name;
private boolean enabled = true;
// getters/setters
}
public class UserRequest {
private String name;
// enabled is removed
// getters/setters
}
@Controller
public class UserController {
@RequestMapping(value="/user", method=RequestMethod.POST)
@ResponseBody
public String createRealm(@RequestBody UserRequest userRequest) {
User user = ... // map UserRequest -> User
userService.createUser(user);
...
}
}
Есть ли другой способчто позволяет избежать дублирования кода и легче поддерживать?