自定义约束验证失败

时间:2018-02-19 16:15:03

标签: java-ee payara

在payara服务器4.1.2.174上,我尝试对通过rest发送到服务器的参数实现自定义验证。但是,由于某种原因它不起作用。我的payara默认使用hibernate-validator 5.2.4。我在项目中使用与范围provided相同的依赖项。

向目标发送有效请求时抛出异常。

[2018-02-19T16:27:31.173+0100] [Payara 4.1] [WARNUNG] [] [org.glassfish.jersey.server.validation.internal.ValidationExceptionMapper] [tid: _ThreadID=27 _ThreadName=http-thread-pool::http-listener-1(1)] [timeMillis: 1519054051173] [levelValue: 900] [[
  Unexpected Bean Validation problem.
javax.validation.ValidationException: HV000029: Constraint factory returned null when trying to create instance of com.uni.api.relationship.v1.filters.BrandColorValidator.
  at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.createAndInitializeValidator(ConstraintValidatorManager.java:181)
  at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.getInitializedValidator(ConstraintValidatorManager.java:122)
  at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorNoUnwrapping(ConstraintTree.java:303)
  at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorInstanceForAutomaticUnwrapping(ConstraintTree.java:244)
  at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:163)
  at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:116)
  at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:87)
  at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:73)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:617)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:580)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:524)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:492)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:457)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:407)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedConstraint(ValidatorImpl.java:795)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateCascadedConstraints(ValidatorImpl.java:681)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateParametersInContext(ValidatorImpl.java:1141)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateParameters(ValidatorImpl.java:299)
  at org.hibernate.validator.internal.engine.ValidatorImpl.validateParameters(ValidatorImpl.java:253)
  at org.glassfish.jersey.server.validation.internal.DefaultConfiguredValidator.onValidate(DefaultConfiguredValidator.java:175)
  at org.glassfish.jersey.server.validation.internal.ValidationInterceptorExecutor.proceed(ValidationInterceptorExecutor.java:113)
  at org.glassfish.jersey.server.validation.internal.DefaultConfiguredValidator.validateResourceAndInputParams(DefaultConfiguredValidator.java:146)
  at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:134)
  at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205)
  at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
  at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
  at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
  at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
  at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
  at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
  at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
  at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
  at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
  at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
  at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
  at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
  at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
  at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
  at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
  at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
  at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
  at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
  at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1692)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:339)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:209)
  at com.uni.business.common.logging.LogContextInitialiser.doFilter(LogContextInitialiser.java:71)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:251)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:209)
  at com.uni.presentation.common.servlet.EntryServletFilter.doFilter(EntryServletFilter.java:159)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:251)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:209)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
  at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:654)
  at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:593)
  at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159)
  at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238)
  at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:483)
  at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180)
  at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
  at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
  at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
  at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
  at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
  at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
  at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
  at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
  at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
  at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
  at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
  at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
  at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
  at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
  at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
  at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
  at java.lang.Thread.run(Thread.java:748)
]]

BrandColorValidator

package com.uni.api.relationship.v1.filters;
[... imports ...]
public class BrandColorValidator implements ConstraintValidator<BrandColor, BrandV1> {

    @Inject
    private BrandColorMapper brandMapper;

    @Override
    public void initialize(final BrandColor brandColor) {
    }

    @Override
    public boolean isValid(final BrandV1 brand, final ConstraintValidatorContext constraintValidatorContext) {
        ...
    }
}

注释

package com.uni.api.relationship.v1.filters;
[... imports ...]
@Target({ PARAMETER, FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = BrandColorValidator.class)
public @interface BrandColor {
    String message() default "brand is invalid";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

要验证的对象

package com.uni.api.relationship.v1.filters;
[... imports ...]
public class MyParams {
    @QueryParam(BRAND) //
    @NotNull
    @BrandColor
    private BrandV1 brand;
}

在资源中

@GET
@Path("/{val}/conditions")
@Produces(MediaType.APPLICATION_JSON)
public PreconditionsStatusV1 verifyMappingPreconditions(@Valid @BeanParam final MyParams queryParams) {
    [...]
}

然后我尝试将它与xml配置一起使用,因为我不确定是否需要它但是这给了我相同的结果(同样的例外):

的validation.xml

<validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration validation-configuration-1.1.xsd"
                   version="1.1">
    <constraint-mapping>META-INF/validation/constraint-mapping.xml</constraint-mapping>
</validation-config>

约束mapping.xml

<constraint-mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/mapping validation-mapping-1.1.xsd"
                     xmlns="http://jboss.org/xml/ns/javax/validation/mapping"
                     version="1.1">

    <constraint-definition annotation="com.uni.api.relationship.v1.filters.BrandColor">
        <validated-by include-existing-validators="false">
            <value>com.uni.api.relationship.v1.filters.BrandColorValidator</value>
        </validated-by>
    </constraint-definition>

</constraint-mappings>  

0 个答案:

没有答案