我正在处理一个项目,我需要在我的代码中使用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
注释的神秘消失。我需要帮助才能找出我做错的事情。任何想法将不胜感激。