【发布时间】:2021-03-02 19:15:34
【问题描述】:
我正在尝试验证我的数据对象,但即使传递了无效输入也没有收到任何错误
以下类用于违规检查。
package in.rps.validator;
import in.rps.exception.InvalidRequestException;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;
@Service
public class ObjectValidator {
private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
private static final Validator validator = factory.getValidator();
public <T> void validate(Object o, Class<T> clazz) {
if (clazz.isInstance(o)){
T request = ((T) clazz);
Set<ConstraintViolation<T>> constraintViolations = validator.validate(request);
if (!constraintViolations.isEmpty()){
throw new InvalidRequestException();
}
}else{
throw new InvalidRequestException();
}
}
}
对象类
package in.rps.model.response;
import in.rps.model.Dispute;
import in.rps.model.Metadata;
import lombok.*;
import lombok.experimental.FieldDefaults;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class DisputeHandleResponse {
@NotNull
Metadata metadata;
@NotNull
Response response;
@NotNull
Dispute dispute;
@NotNull
@Pattern(regexp = "^[a-zA-Z0-9]*$")
@Size(min =1, max = 35)
String requestId;
}
以下是我的 Gradle 依赖项。
compile("org.springframework.boot:spring-boot-starter-validation:2.3.7.RELEASE")
compile group: 'org.glassfish', name: 'javax.el', version: '3.0.1-b12'
compile group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final'
我有多个数据对象需要根据要求进行验证,类似于上述数据对象。然而,问题是所有的约束验证都不起作用。
方法调用验证函数。
@CrossOrigin
@PostMapping(path = "/createRequest", produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<Object> createDispute(@RequestBody String request) {
Gson g = new Gson();
DisputeResponse d = g.fromJson(request, DisputeHandleResponse.class);
d.setRequestId(null);
objectValidator.validate(d, DisputeHandleResponse.class);
restService.process(uri, "dispute/create", request);
return ResponseEntity.ok().body(Acknowledgement.builder().build());
}
不确定我是否遗漏了什么。任何帮助将不胜感激。
【问题讨论】:
-
如何运行验证?被测物体长什么样?
-
对,这些东西实际上都不是类,只是 sn-ps。请发布两者的完整课程代码。
-
我已经用完整的课程代码更新了这个问题。提前致谢。
-
该更新没有回答我的任何一个问题。您如何称呼验证过程?您正在验证的实际对象如何?它真的违反了约束吗?
-
验证方法被调用为 API 调用的一部分。而且我正在明确测试负面情况,所以是的,约束被违反了。例如,我将请求 Id 显式传递为 null,它有一个 @NotNull 约束,它仍然在传递。我也添加了调用函数。
标签: java validation