如何添加@NotNull注释的运行时处理

我很惊讶地看到IntelliJ在运行/调试unit testing时实际上在IDEA中对@NotNull进行了运行时validation。 我可以将这个相同的function添加到我的maven构建中吗? (我需要什么jar子/ jvm设置?)

IDEA正在使用自己的检测字节码的方法来添加此类validation。 对于命令行构建,我们提供执行检测的javac2 Ant任务(扩展标准javac任务)。 如果从IDEA生成Ant构建,则可以选择使用javac2。

我们还没有提供类似的Maven插件 ,但是有第三方版本可能适合你(虽然它似乎有点旧)。

您可以在JUnit测试中进行注释validation。

 import java.util.Set; import javax.validation.ConstraintViolation; import junit.framework.Assert; import org.hibernate.validator.HibernateValidator; import org.junit.Before; import org.junit.Test; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; public class Temp { private LocalValidatorFactoryBean localValidatorFactory; @Before public void setup() { localValidatorFactory = new LocalValidatorFactoryBean(); localValidatorFactory.setProviderClass(HibernateValidator.class); localValidatorFactory.afterPropertiesSet(); } @Test public void testLongNameWithInvalidCharCausesValidationError() { final ProductModel productModel = new ProductModel(); productModel.setLongName("A long name with\ta Tab character"); Set> constraintViolations = localValidatorFactory.validate(productModel); Assert.assertTrue("Expected validation error not found", constraintViolations.size() == 1); } } 

如果你的毒药是spring,请看看这些弹簧unit testing

我会采用AOP的方式:

首先,您需要一个兼容javax.validation的validation器( Hibernate Validator是参考实现)。

现在创建一个具有Validator实例的aspectj方面,并检查所有方法参数是否存在validation错误。 这是一个快速版本,可以帮助您入门:

 public aspect ValidationAspect { private final Validator validator; { final ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); } pointcut serviceMethod() : execution(public * com.yourcompany**.*(..)); before() : serviceMethod(){ final Method method = (Method) thisJoinPoint.getTarget(); for(final Object arg : thisJoinPoint.getArgs()){ if(arg!=null) validateArg(arg,method); } } private void validateArg(final Object arg, final Method method) { final Set> validationErrors = validator.validate(arg); if(!validationErrors.isEmpty()){ final StringBuilder sb = new StringBuilder(); sb.append("Validation Errors in method ").append(method).append(":\n"); for (final ConstraintViolation constraintViolation : validationErrors) { sb.append(" - ").append(constraintViolation.getMessage()).append("\n"); } throw new RuntimeException(sb.toString()); } } } 

使用aspectj-maven-plugin将该方面编织到测试和/或生产代码中。

如果您只想要此function进行测试,则可以将aspectj-plugin执行放在配置文件中。