约束注释不可见

时间:2018-02-16 20:44:50

标签: hibernate maven validation

我正在处理一个项目,我需要在我的代码中使用Hibernate Validator来验证Java bean。我创建了一个用于处理某些数据的API,我想将它封装到一个jar库中,然后将它作为依赖项添加到一个单独的Web项目中。 问题是当我向我的Java bean添加@NotEmpty@NotBlank注释时,当我尝试在另一个项目中使用该实体时,验证器没有看到这些注释。反射API都不能在运行时找到这些注释。这是一个例子:

@Entry(...)
public class Person {
    private String firstName;
    private String lastName;

    @NotBlank
    public String getFirstName() {
        return firstName;
    }

    @NotBlank
    public String getLastName() {
        return lastName;
    }
}

我使用Spring LDAP API,所以暂时不要注意@Entry注释。 然后,此代码通过Maven安装过程成为jar文件,并在本地Maven存储库中可用。 项目内部的单元测试完美地显示了两个违规行为,如下所示:

public class PersonValidationTest {
    @Test
    public void testValidation() {
       ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
       Validator validator = factory.getValidator();

       Person person = new Person();

       Set<ConstraintViolation<Person>> violations = validator.validate(person);
       assertThat(violations).hasSize(2);
    }
}

接下来我尝试在Spring MVC控制器内的另一个项目中使用Person类(这是我的Java bean),如下所示:

@RestController
public class PersonController
    private Validator validator;

    @Autowired
    public void setValidator(Validator validator) {
        this.validator = validator;
    }

    @PostMapping(value = "/api/person")
    public ResponseEntity<String> createPerson(@RequestBody String data) {
        JSONObject response = new JSONObject();

        Person p = new Person();
        try {
           //person = PersonUtils.json2Person(data);

           Set<ConstraintViolation<Person>> violations = validator.validate(p);   

            if(violations.isEmpty()) {
                response.put("status", "success");
                response.put("data", new JSONObject(p.toJSON()));
            } else {
                JSONArray errors = new JSONArray();
                for(ConstraintViolation<Person> v : violations) {
                    JSONObject err = new JSONObject();
                    errObj.put(v.getPropertyPath().toString(), v.getMessage());
                    errors.put(err);
                }
                response.put("status", "failed");
                response.put("data", errors);
            }
          } catch (Exception e) {
              response.put("status", "error");
              response.put("message", e.getMessage());
          }
      return new ResponseEntity<>(response.toString(), HttpStatus.OK)
   }
}

Hibernate Validator是在配置类中创建的,然后由Spring框架注入,但它并不重要,所以我不提供代码。问题是,当在控制器方法内部进行验证时,Person类的getter缺少那些@NotBlank约束注释。无论是通过p.getClass().getMethods()还是通过method.getAnnotations(),都不会显示这些注释的任何痕迹。验证方法只返回空的违规列表,就像没有任何约束注释一样。我想知道在将Java bean编译成jar并将jar作为依赖项添加到另一个Maven项目之后,注释变得不可用时应该如何成为可能。我尝试使用Person类直接在IDE(Eclipse STS)中将项目标记为依赖项,在这种情况下,验证按预期工作,显示两个约束违规但是当使用Maven依赖时,验证不起作用。在使用Maven项目中的注释方面,我有什么问题吗?我试着研究和Google搜索疯狂但没有运气。没有关于此类问题的任何信息,例如案件非常独特,之前没有人遇到过这个问题。我知道使用@Valid注释进行Spring验证很方便,可以在这个场景中使用但是我隐藏了Person类的一些细节,我不能用它来从JSON到Java对象的隐式编组。我必须将JSON作为String,然后通过Jackson API使用自定义字段映射将其转换为Person。之后,我运行验证以检查是否所有数据都存在。所以主要问题是@NotBlank注释的神秘消失。我需要帮助才能找出我做错的事情。任何想法将不胜感激。

0 个答案:

没有答案