如何让我的 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 验证器机制(或者更具体的休眠机制,如果可用的话)。但我可以想象你想重用已经配置的实例。