【问题标题】:javax.validation not validating data objectsjavax.validation 不验证数据对象
【发布时间】: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


【解决方案1】:

问题现已解决。问题出在 validate 方法上。 使用下面的方法效果很好。

public <T> void validate(Object o, Class<T> clazz)  {

    if (clazz.isInstance(o)){
        Set<ConstraintViolation<T>> constraintViolations = validator.validate((T)o);
        if (!constraintViolations.isEmpty()){
            throw new InvalidRequestException();
        }
    }else{
        throw new InvalidRequestException();
    }
}

感谢大家的宝贵意见。

【讨论】:

    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2019-06-12
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多