如何让我的 Spring 方面在服务方法上启动 @Valid 注释?
How do I get my Spring Aspect to kick in for a @Valid annotation on a service method?
我们正在使用 Spring 3.2.11.RELEASE 和 Maven 3.0.3。我正在尝试设置对传递给服务方法的参数的验证。方法如下。注意 @Valid
注释。
package org.mainco.subco.mypck.service;
@Service
@RemoteProxy
@Transactional
public class MypckServiceImpl implements MypckService {
@RemoteMethod
@Override
public String myMethod(@Valid final MyObjectDto request) {
// ...
}
}
这是我为帮助验证对象而设置的方面:
@Aspect
@Component
public class MyObjectValidatingAspect extends AbstractDWRAspectValidator<MyObjectDto>
{
@Before("execution(* org.mainco.subco.mypck.service.MypckService.myMethod(..))")
public void validateBefore(JoinPoint jp)
{
errors = new ArrayList<String>();
final MyObjectDto request = validate(jp);
validateMyObject(request);
throwErrors();
} // validateBefore
这包含在我的应用程序上下文文件中:
<global-method-security pre-post-annotations="enabled">
</global-method-security>
<aop:aspectj-autoproxy/>
这就是我在 Maven pom.xml 文件中包含的内容:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.2</version>
</dependency>
不幸的是,调用该方法时,永远不会调用 aspectj 的 validateBefore
。我还需要做什么才能调用它?
自 Spring 3.1 以来,您的应用程序上下文中有 MethodValidationInterceptor
which basically does what you want to achieve yourself. To have this interceptor applied the only thing you need to do is to register a MethodValidationPostProcessor
。
默认情况下,它将检查来自 Spring 的 @Validated
注释,但您可以指示它扫描 @Valid
注释。
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
<property name="validatedAnnotationType" value="javax.validation.Valid" />
<property name="validator" ref="refToYOurLocalValidatorFactoryBean" />
</bean>
如果您不指定 validator
,将使用默认的 JSR-303 验证器机制(或者更具体的休眠机制,如果可用的话)。但我可以想象你想重用已经配置的实例。
我们正在使用 Spring 3.2.11.RELEASE 和 Maven 3.0.3。我正在尝试设置对传递给服务方法的参数的验证。方法如下。注意 @Valid
注释。
package org.mainco.subco.mypck.service;
@Service
@RemoteProxy
@Transactional
public class MypckServiceImpl implements MypckService {
@RemoteMethod
@Override
public String myMethod(@Valid final MyObjectDto request) {
// ...
}
}
这是我为帮助验证对象而设置的方面:
@Aspect
@Component
public class MyObjectValidatingAspect extends AbstractDWRAspectValidator<MyObjectDto>
{
@Before("execution(* org.mainco.subco.mypck.service.MypckService.myMethod(..))")
public void validateBefore(JoinPoint jp)
{
errors = new ArrayList<String>();
final MyObjectDto request = validate(jp);
validateMyObject(request);
throwErrors();
} // validateBefore
这包含在我的应用程序上下文文件中:
<global-method-security pre-post-annotations="enabled">
</global-method-security>
<aop:aspectj-autoproxy/>
这就是我在 Maven pom.xml 文件中包含的内容:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.2</version>
</dependency>
不幸的是,调用该方法时,永远不会调用 aspectj 的 validateBefore
。我还需要做什么才能调用它?
自 Spring 3.1 以来,您的应用程序上下文中有 MethodValidationInterceptor
which basically does what you want to achieve yourself. To have this interceptor applied the only thing you need to do is to register a MethodValidationPostProcessor
。
默认情况下,它将检查来自 Spring 的 @Validated
注释,但您可以指示它扫描 @Valid
注释。
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
<property name="validatedAnnotationType" value="javax.validation.Valid" />
<property name="validator" ref="refToYOurLocalValidatorFactoryBean" />
</bean>
如果您不指定 validator
,将使用默认的 JSR-303 验证器机制(或者更具体的休眠机制,如果可用的话)。但我可以想象你想重用已经配置的实例。