【发布时间】:2014-05-07 07:12:52
【问题描述】:
在java中什么时候使用注解有什么细节,或者更准确地说,是下面问题的答案是或否
只有在这种条件下,才能使用这种特殊的注解。
显然,上述语句中的 this 可以是任何东西,也可以什么都不是。
我问这个问题的原因是我得到了这个代码库,他们使用了一些注释来验证类、属性等。现在,这是一个 Web 应用程序,它使用了所有的 spring beans 和什么不是。
我尝试了以下代码。 (这只是普通的java代码,没有spring什么的。这是整个代码)
public class AnnotationsTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
TestMe t = new TestMe();
System.out.println(t.getTest1());
}
}
class TestMe{
@NotNull
private String test1;
public String getTest1() {
return test1;
}
public void setTest1(String test1) {
this.test1 = test1;
}
}
这个打印出 null 作为输出。为什么没有进行任何验证?
嗯,我猜我已经为此提供了注释,但还没有真正验证。所以我去了this link。其中他有各种各样的ValidationFactory 等等。
所以我写了,
public class AnnotationsTest{
private static Validator validator;
public static void main(String[] args) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
TestMe t = new TestMe();
Set<ConstraintViolation<TestMe>> constraintViolations =
validator.validate(t);
assertEquals(1, constraintViolations.size());
assertEquals("may not be null", constraintViolations.iterator().next().getMessage());
}
}
但是这个给出了以下错误
Exception in thread "main" javax.validation.ValidationException: Unable to find a default provider
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:264)
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)
at AnnotationsTest.main(AnnotationsTest.java:29)
所以这是我的问题:
1、以上两种情况到底发生了什么?
2. 我认为注释就足够了,就像Autowired 之类的东西,他们只会自己注入类。但是在这里为什么我需要做额外的事情来验证。为什么@NotNull 不自己验证这些东西。
谢谢。
【问题讨论】:
-
javax.validation... 只是一个 API。你还需要一个像 Hibernate-Validator 这样的实现。这应该可以解决未找到的问题。
标签: java spring hibernate validation annotations