수동으로 스프링 주석 유효성 검사 호출
다음과 같은 Hibernate 및 Spring Annotation을 사용하여 많은 검증 작업을 수행하고 있습니다.
public class Account {
@NotEmpty(groups = {Step1.class, Step2.class})
private String name;
@NotNull(groups = {Step2.class})
private Long accountNumber;
public interface Step1{}
public interface Step2{}
}
그런 다음 컨트롤러에서 인수로 호출됩니다.
public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) {
//some more code and stuff here
return "";
}
하지만 저는 컨트롤러 방식의 어떤 논리를 바탕으로 사용되는 그룹을 결정하고 싶습니다.수동으로 유효성 검사를 호출하는 방법이 있습니까?비슷한 것result = account.validate(Account.Step1.class)?
독자적인 Validator 클래스를 만드는 것은 알고 있지만, 이는 피하고 싶은 것입니다. 클래스 변수 자체에 주석을 사용하는 것이 좋습니다.
Spring은 Spring 인터페이스와 Java Bean Validation 인터페이스를 구현하는 Local Validator Factory Bean을 제공합니다.
// org.springframework.validation.SmartValidator - implemented by LocalValidatorFactoryBean
@Autowired
SmartValidator validator;
public String saveAccount(@ModelAttribute Account account, BindingResult result) {
// ... custom logic
validator.validate(account, result, Account.Step1.class);
if (result.hasErrors()) {
// ... on binding or validation errors
} else {
// ... on no errors
}
return "";
}
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Driver driver = new Driver();
driver.setAge(16);
Car porsche = new Car();
driver.setCar(porsche);
Set<ConstraintViolation<Driver>> violations = validator.validate( driver );
예, Validator 공장에서 Validator 인스턴스를 가져와 직접 검증을 실행한 다음 위반 여부를 확인할 수 있습니다.검증자용 javadoc에서 검증할 그룹 배열도 수락하는 것을 확인할 수 있습니다.
분명히 이것은 Spring 유효성 검사를 거치지 않고 JSR-303 유효성 검사를 직접 사용하지만, 클래스 경로에서 발견되면 Spring 유효성 검사 주석이 JSR-303을 사용할 것이라고 생각합니다.
모든 항목을 올바르게 구성한 경우 다음 작업을 수행할 수 있습니다.
import javax.validation.Validator;
@Autowired
Validator validator;
그런 다음 개체의 유효성을 확인하는 데 사용할 수 있습니다.
var errors = validator.validate(obj);
이 링크는 Spring 앱에서 유효성 검사를 사용하는 매우 좋은 예를 제공합니다.https://reflectoring.io/bean-validation-with-spring-boot/
저는 이 기사에서 검증 프로그램을 프로그래밍 방식으로 실행할 수 있는 예제를 찾았습니다.
class MyValidatingService {
void validatePerson(Person person) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Person>> violations = validator.validate(person);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
}
}
던집니다.500상태이므로 사용자 지정 예외 처리기로 처리하는 것이 좋습니다.
@ControllerAdvice(annotations = RestController.class)
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<CustomErrorResponse> constraintViolationException(HttpServletResponse response, Exception ex) throws IOException {
CustomErrorResponse errorResponse = new CustomErrorResponse();
errorResponse.setTimestamp(LocalDateTime.now());
errorResponse.setStatus(HttpStatus.BAD_REQUEST.value());
errorResponse.setError(HttpStatus.BAD_REQUEST.getReasonPhrase());
errorResponse.setMessage(ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
}
두 번째 예는 https://www.mkyong.com/spring-boot/spring-rest-error-handling-example/ 의 예입니다.
업데이트: 지속성 계층은 사용하지 않는 것이 좋습니다. https://twitter.com/odrotbohm/status/1055015506326052865
@digitaljoel의 답변에 추가하여 제약 위반을 던질 수 있습니다.일단 위반 집합을 얻으면 예외입니다.
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<NotionalProviderPaymentDTO>> violations = validator.validate( notionalProviderPaymentDTO );
if(!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
제약 조건 위반을 처리할 고유한 예외 매퍼를 만들 수 있습니다.예외를 지정하고 오류 메시지를 클라이언트에 보냅니다.
그리고 다음과 같습니다.
@Autowired
@Qualifier("mvcValidator")
Validator validator;
...
violations = validator.validate(account);
import javax.validation.Validator;
import javax.validation.ConstraintViolation;
public class{
@Autowired
private Validator validator;
.
.
public void validateEmployee(Employee employee){
Set<ConstraintViolation<Employee>> violations = validator.validate(employee);
if(!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
}
}
여기서 '직원'은 pojo 클래스이고 '직원'은 목적어입니다.
언급URL : https://stackoverflow.com/questions/19190592/manually-call-spring-annotation-validation
'programing' 카테고리의 다른 글
| Twitter 부트스트랩 툴팁에 여러 줄이 포함되도록 만드는 방법은 무엇입니까? (0) | 2023.08.30 |
|---|---|
| jQuery로 인라인 스타일을 제거할 수 있습니까? (0) | 2023.08.30 |
| 컨트롤러를 추가하기 위한 상황에 맞는 메뉴/보기 누락 (0) | 2023.08.30 |
| 대용량 가져오기 InnoDB - 오류 로그 항목 분석 (0) | 2023.08.30 |
| 하위 요소의 여백이 상위 요소를 이동합니다. (0) | 2023.08.25 |