[jboss-jira] [JBoss JIRA] (WFLY-10752) [WFLY13] NPE on deploy, when Email validation annotation present

d3coder d3coder (JIRA) issues at jboss.org
Fri Jul 27 08:27:00 EDT 2018


d3coder d3coder created WFLY-10752:
--------------------------------------

             Summary: [WFLY13] NPE on deploy, when Email validation annotation present
                 Key: WFLY-10752
                 URL: https://issues.jboss.org/browse/WFLY-10752
             Project: WildFly
          Issue Type: Bug
         Environment: Arch linux, openjdk 8, Wildfly 13.0.0.Final
            Reporter: d3coder d3coder
            Assignee: Jason Greene


I'm making simple app. In one of my DTO's i have field with `javax.validation.constraints.Email` annotation. When this annotation present, wildfly fails to deploy my app with this exception:
```
java.lang.NullPointerException
	at sun.reflect.annotation.TypeAnnotationParser.mapTypeAnnotations(TypeAnnotationParser.java:356)
	at sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl.<init>(AnnotatedTypeFactory.java:139)
	at sun.reflect.annotation.AnnotatedTypeFactory.buildAnnotatedType(AnnotatedTypeFactory.java:65)
	at sun.reflect.annotation.TypeAnnotationParser.buildAnnotatedType(TypeAnnotationParser.java:79)
	at java.lang.reflect.Field.getAnnotatedType(Field.java:1170)
	at org.hibernate.validator.internal.metadata.provider.TypeAnnotationAwareMetaDataProvider.findTypeAnnotationConstraintsForMember(TypeAnnotationAwareMetaDataProvider.java:65)
	at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findPropertyMetaData(AnnotationMetaDataProvider.java:244)
	at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getFieldMetaData(AnnotationMetaDataProvider.java:227)
	at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.retrieveBeanConfiguration(AnnotationMetaDataProvider.java:137)
	at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getBeanConfiguration(AnnotationMetaDataProvider.java:125)
	at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getBeanConfigurationForHierarchy(AnnotationMetaDataProvider.java:108)
	at org.hibernate.validator.internal.metadata.BeanMetaDataManager.createBeanMetaData(BeanMetaDataManager.java:203)
	at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getOrCreateBeanMetaData(BeanMetaDataManager.java:231)
	at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getBeanMetaData(BeanMetaDataManager.java:178)
	at org.hibernate.validator.internal.engine.ValidatorImpl.getConstraintsForClass(ValidatorImpl.java:327)
	at org.hibernate.validator.internal.cdi.ValidationExtension.determineConstrainedCallables(ValidationExtension.java:241)
	at org.hibernate.validator.internal.cdi.ValidationExtension.processAnnotatedType(ValidationExtension.java:228)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:95)
	at org.jboss.weld.injection.StaticMethodInjectionPoint.invoke(StaticMethodInjectionPoint.java:85)
	at org.jboss.weld.injection.MethodInvocationStrategy$SimpleMethodInvocationStrategy.invoke(MethodInvocationStrategy.java:129)
	at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:330)
	at org.jboss.weld.event.ExtensionObserverMethodImpl.sendEvent(ExtensionObserverMethodImpl.java:123)
	at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:308)
	at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:286)
	at org.jboss.weld.bootstrap.events.ContainerLifecycleEvents.fireProcessAnnotatedType(ContainerLifecycleEvents.java:203)
	at org.jboss.weld.bootstrap.events.ContainerLifecycleEvents.fireProcessAnnotatedType(ContainerLifecycleEvents.java:174)
	at org.jboss.weld.bootstrap.BeanDeployer.processAnnotatedTypes(BeanDeployer.java:166)
	at org.jboss.weld.bootstrap.BeanDeployment.createTypes(BeanDeployment.java:219)
	at org.jboss.weld.bootstrap.WeldStartup.startInitialization(WeldStartup.java:415)
	at org.jboss.weld.bootstrap.WeldBootstrap.startInitialization(WeldBootstrap.java:79)
	at org.jboss.as.weld.WeldStartService.start(WeldStartService.java:95)
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1736)
	at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1698)
	at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1556)
	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
	at java.lang.Thread.run(Thread.java:748)
```

My DTO class:
```java
package dk.xakeps.truestarter.server.dto.request;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import dk.xakeps.truestarter.server.validator.CrossField;

import javax.annotation.Nonnull;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@CrossField(fields = {"password", "passwordRetry"})
public class RegisterRequest {
    @NotNull
    @Email
    @Size(max = 150)
    private final String email;
    @NotNull
    @Size(min = 3, max = 16)
    private final String username;
    @NotNull
    @Size(min = 6, max = 32)
    private final String password;
    @NotNull
    @Size(min = 6, max = 32)
    private final String passwordRetry;

    @JsonCreator
    public RegisterRequest(@Nonnull @JsonProperty("email") String email,
                           @Nonnull @JsonProperty("username") String username,
                           @Nonnull @JsonProperty("password") String password,
                           @Nonnull @JsonProperty("passwordRetry") String passwordRetry) {
        this.email = email;
        this.username = username;
        this.password = password;
        this.passwordRetry = passwordRetry;
    }

    public String getEmail() {
        return email;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getPasswordRetry() {
        return passwordRetry;
    }
}
```

CrossField annotation:
```java
package dk.xakeps.truestarter.server.validator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CrossFieldValidator.class)
public @interface CrossField {
    String message() default "{CrossField.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    String[] fields();
}
```

CrossField validator:
```java
*package dk.xakeps.truestarter.server.validator;

import org.apache.commons.beanutils.PropertyUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.ValidationException;
import java.lang.reflect.InvocationTargetException;

public class CrossFieldValidator implements ConstraintValidator<CrossField, Object> {
    private String[] fields;

    @Override
    public void initialize(CrossField constraintAnnotation) {
        this.fields = constraintAnnotation.fields();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        Object prevFieldValue = null;
        int i = 0;
        for (String field : fields) {
            try {
                Object property = PropertyUtils.getProperty(value, field);
                if (i == 0) {
                    prevFieldValue = property;
                    i++;
                    continue;
                }
                if (!prevFieldValue.equals(property)) {
                    return false;
                }
                prevFieldValue = property;
                i++;
            } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                throw new ValidationException("Failed validating bean", e);
            }
        }
        return true;
    }
}
```



--
This message was sent by Atlassian JIRA
(v7.5.0#75005)


More information about the jboss-jira mailing list