验证@ScriptAssert可以访问静态方法

Ral*_*lph 8 java bean-validation

JSR303 Bean Validation实现Hibernate-Validator(4.1.0)提供了org.hibernate.validator.constraints.ScriptAssert注释.

我得到了它来调用非静态方法.

@ScriptAssert(script="_this.isComplexSubValid(_this.attributeA,_this.attributeB)",
              lang = "javascript")

...
public boolean isComplexSubValid(Object a, Object b)...
Run Code Online (Sandbox Code Playgroud)

但现在我想将isComplexSubValid静态方法外部化,以便在不同的类中重用它.但是我没有使用javascript验证器进行静态调用.

@ScriptAssert(script="ComplexValidation.isComplexSubValid(_this.attributeA,_this.attributeB)",
              lang = "javascript")

public static boolean isComplexSubValid(Object a, Object b)...
Run Code Online (Sandbox Code Playgroud)

抛出:

isValid调用期间出现意外异常:org.hibernate.validator.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:156)org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:140)org.hibernate.validator.metadata. MetaConstraint.validateConstraint(MetaConstraint.java:121)org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:327)org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForRedefinedDefaultGroup(ValidatorImpl.java:273)org.hibernate作为. validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:256)org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:210)org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:119) org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:86)org.springframework.validation.DataBinder.validate(DataBinder.java:692)org.springframework.web.bin d.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:807)org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:359)org.springframework.web.bind.annotation.support. HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter. java:414)org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)org.springframework.web.servlet.FrameworkServlet. processRequest(FrameworkServlet.java:644)org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:571)javax.servlet.http.HttpServlet.service(HttpServlet.java:640)javax.servlet.http.HttpServlet.service(HttpServlet.java:717)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 206)org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)org.apache.catalina.core.ApplicationFilterChain. internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:368)org.springframework. security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)org.s pringframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:380)org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain. doFilter(FilterChainProxy.java:380)org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:380)org. springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:380)org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter. doFilter(SecurityContextHolderAwareRequestFilter.java:54)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.ja va:380)org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:380)org.springframework.security. web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:380)org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter( AbstractAuthenticationProcessingFilter.java:187)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:380)org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)组织. springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:380)org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityC ontextPersistenceFilter.java:79)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:380)org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)org.springframework.web. filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)组织. apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)de.humanfork.security.crsf.IdempotentCsrfPreventionFilter.doFilter(IdempotentCsrfPreventionFilter.java:99)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 235)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:74)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:206)org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:113)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)org.apache.catalina. core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)org. springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.ApplicationFilterC hain.doFilter(ApplicationFilterChain.java:206)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)org.apache. catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process( Http11Protocol.java:588)org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489)java.lang.Thread.run(Thread.java:662)

所以我的问题是如何在脚本标签中调用静态方法?

请不要告诉我,我可以实现我的验证器,而不是使用@Script标签.

Ral*_*lph 5

具有静态方法的类的类名必须是完全限定的。

ScriptAssert(script="com.example.demo.ComplexValidation.isComplexSubValid(_this.attributeA,_this.attributeB)",
          lang = "javascript")
Run Code Online (Sandbox Code Playgroud)

公共静态布尔 isComplexSubValid(对象 a, 对象 b)...