[jboss-jira] [JBoss JIRA] (WFLY-12083) Deployment failure if an explicit bean archive contain a Pojo with @NotNull annotation

Tomas Hofman (Jira) issues at jboss.org
Thu May 30 07:44:00 EDT 2019


    [ https://issues.jboss.org/browse/WFLY-12083?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13740462#comment-13740462 ] 

Tomas Hofman commented on WFLY-12083:
-------------------------------------

The interceptor being applied is 
{code}Interceptor [class org.hibernate.validator.cdi.internal.interceptor.ValidationInterceptor intercepts @MethodValidated]{code}

Interesting passage from CDI spec is

{quote}
3.11. Unproxyable bean types

The container uses proxies to provide certain functionality. Certain legal bean types cannot be proxied by the container:
* classes which don’t have a non-private constructor with no parameters,
* ...

A bean type must be proxyable if an injection point resolves to a bean:
* ...
* that has a bound interceptor.

Otherwise, the container automatically detects the problem, and treats it as a deployment problem.
{quote}

So that would look as an application problem - defining non-proxyable bean but requesting a functionality (validation) that requires a proxy?

There's already a configuration option in Weld that causes it to print a warning (instead of failing a deployment) when a *final* method is being intercepted:

{code}
InterceptionModelInitializer:

    private void initInterceptor(InterceptionType interceptionType, AnnotatedMethod<?> method, Set<Annotation> methodBindingAnnotations) {
        List<Interceptor<?>> methodBoundInterceptors = manager.resolveInterceptors(interceptionType, methodBindingAnnotations);
        if (methodBoundInterceptors != null && methodBoundInterceptors.size() > 0) {
            Method javaMethod = method.getJavaMember();
            if (Reflections.isFinal(javaMethod)) {
                if (configuration.isFinalMethodIgnored(javaMethod.getDeclaringClass().getName())) {
                    BeanLogger.LOG.finalMethodNotIntercepted(javaMethod, methodBoundInterceptors.get(0).getBeanClass().getName());
                } else {
                    throw BeanLogger.LOG.finalInterceptedBeanMethodNotAllowed(method, methodBoundInterceptors.get(0).getBeanClass().getName());
                }
            } else {
                builder.interceptMethod(interceptionType, javaMethod, asInterceptorMetadata(methodBoundInterceptors), methodBindingAnnotations);
            }
        }
    }
{code}

So similar condition could be added to check for non-private constructor?

> Deployment failure if an explicit bean archive contain a Pojo with @NotNull annotation
> --------------------------------------------------------------------------------------
>
>                 Key: WFLY-12083
>                 URL: https://issues.jboss.org/browse/WFLY-12083
>             Project: WildFly
>          Issue Type: Bug
>          Components: Bean Validation
>    Affects Versions: 17.0.0.Alpha1
>            Reporter: Joerg Baesner
>            Assignee: Brian Stansberry
>            Priority: Major
>         Attachments: playground.zip
>
>
> If an exlicit bean archive ({{META-INF}} contains an empty {{beans.xml}}) contain a Pojo without any Bean defining annotations and it has {{@NotNull}} annotations, the deployment of that module fails with:
> {code}
> ERROR [org.jboss.msc.service.fail] (MSC service thread 1-5) MSC000001: Failed to start service jboss.deployment.unit."playground-jar.jar".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."playground-jar.jar".WeldStartService: Failed to start service
> 	at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1730)
> 	at org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1558)
> 	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
> 	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
> 	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
> 	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
> 	at java.lang.Thread.run(Thread.java:748)
> Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001436: Type org.jboss.playground.PlaygroundToStringUtil is not proxyable because it has a private constructor [EnhancedAnnotatedConstructorImpl] private org.jboss.playground.PlaygroundToStringUtil() - class org.jboss.playground.PlaygroundToStringUtil.
> 	at org.jboss.weld.injection.producer.InterceptionModelInitializer.init(InterceptionModelInitializer.java:117)
> 	at org.jboss.weld.injection.producer.BeanInjectionTarget.buildInterceptionModel(BeanInjectionTarget.java:94)
> 	at org.jboss.weld.injection.producer.BeanInjectionTarget.initializeInterceptionModel(BeanInjectionTarget.java:89)
> 	at org.jboss.weld.injection.producer.BeanInjectionTarget.initializeAfterBeanDiscovery(BeanInjectionTarget.java:99)
> 	at org.jboss.weld.injection.producer.InjectionTargetInitializationContext.initialize(InjectionTargetInitializationContext.java:42)
> 	at org.jboss.weld.injection.producer.InjectionTargetService.initialize(InjectionTargetService.java:63)
> 	at org.jboss.weld.bootstrap.WeldStartup.deployBeans(WeldStartup.java:481)
> 	at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:86)
> 	at org.jboss.as.weld.WeldStartService.start(WeldStartService.java:97)
> 	at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1738)
> 	at org.jboss.msc.service.ServiceControllerImpl$StartTask.execute(ServiceControllerImpl.java:1700)
> 	... 6 more
> {code}



--
This message was sent by Atlassian Jira
(v7.12.1#712002)



More information about the jboss-jira mailing list