Можно ли сделать так, чтобы объект бизнес-домена (Java-бин, скажем, пользователь) автоматически проверялся с помощью Spring и API-интерфейса валидации бина?
Допустим, у нас есть следующий класс пользователя:
public class User {
@Positive
private final long id;
@NotNull(message = "The username is missing.")
@Size(message = "Username too short",
min = ValidationConstants.USERNAME_MIN_LENGTH)
@Size(message = "Username too long",
max = ValidationConstants.USERNAME_MAX_LENGTH)
private final String username;
public User(final String username) {
this.id = new Random().nextLong();
this.username = username;
}
public long getId() {
return id;
}
public long getUsername() {
return username;
}
public void setUsername(final String username) {
this.username = username;
}
// Other methods...
}
Также у нас может быть класс обслуживания со следующими методами:
public class UserService {
public User createUser(final String username) {
return new User(username);
}
public void changeUsername(final long id, final String newUsername) {
findById(id).ifPresent(user -> user.setUsername(newUsername));
}
private Optional<User> findById(final long id) {
// ...
}
}
Не имея ничего кроме Spring (без JPA, без JAX-RS и т. Д., Только с Spring), возможно ли, чтобы класс User был осведомлен о механизме проверки? Я имею в виду, что после выполнения любого метода из него (может быть, те методы, которые должны быть проверены, имеют некоторую аннотацию или что-то в этом роде), экземпляры класса User должны быть действительными.
Я хочу, чтобы модели моей бизнес-области были самостоятельной единицей бизнес-логики (включая правила проверки для них).
1 ответ
Вы можете проверить ваш экземпляр компонента с помощью аннотации спецификации jsr 303(java validation 1.1) или jsr 349 (java validation 1.1). Валидатор Hibernate обеспечивает очень хорошую реализацию вышеуказанной спецификации.
Другой способ - реализовать интерфейс Spring Validator и разрешить сообщения об ошибках с помощью MessageCodesResolver
,
Проверьте валидацию пружины