2016-10-29 4 views
1

У меня есть раскол проекта уха в 3-х модулей:КДИ управляемый компонент случайно обнаружил

  • веб-модуль,
  • баночка модуль, содержащий мои сущности,
  • модуль EJB.

У меня есть класс, который выглядит следующим образом:

public class UserServiceProviderEnterpriseImpl implements UserServiceProvider { 
    @Override 
    public UserService getUserService() { 
    final BeanManager beanManager = CDI.current().getBeanManager(); 
    Bean<?> bean = beanManager.getBeans("userService").iterator().next(); 
    final CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean); 
    return (UserService) beanManager.getReference(bean, bean.getBeanClass(), creationalContext); 
    } 
} 

Этот класс принадлежит к модулю сущности.

Экземпляр этого класса создается в крюке @PreUpdate в @MappedSuperclass моего объекта @Entity. Этот класс (и упомянутый крюк), выглядит следующим образом:

@MappedSuperclass 
@Access(AccessType.FIELD) 
public abstract class BusinessObject<T extends Serializable> implements Cloneable { 

    // [...] 

    @PrePersist 
    @PreUpdate 
    @SuppressWarnings("unchecked") 
    private void _prePersist() { 

    // [...] 

    final User currentUser = getUserServiceProvider().getUserService().getCurrentUser(); 

    // [...] 
    } 

    private static UserServiceProvider getUserServiceProvider() { 
    try { 
     return SenyuProperties.Core.getUserServiceProviderClass().newInstance(); 
    } catch (InstantiationException | IllegalAccessException e) { 
     throw new RuntimeException("Erreur lors de l'instanciation du UserServiceProvider", e); 
    } 
    } 

    // [...] 
} 

Класс объект расширения этого один в том же модуле класса UserServiceProviderEnterpriseImpl.

Моя проблема здесь появляется в этой строке:

Bean<?> bean = beanManager.getBeans("userService").iterator().next(); 

... иногда бросает NoSuchElementException (причина пустого набора, возвращенное методом # getBeans BeanManager), но иногда нет. Эта проблема кажется развернутой, поскольку я могу развернуть мое ухо, и это произойдет при каждом вызове метода getUserService(), но после повторного развертывания один и тот же сценарий может работать совершенно нормально (метод BeanManager # getBeans не возвращается пустой набор).

Так что мой вопрос: почему этот код ведет себя так, как он делает? Я делаю что-то неправильно? Что может быть источником этой случайности?

Если это может помочь, управляемый боб выглядит следующим образом (это относится к вебу-модулю):

@Named("userService") 
@SessionScoped 
public class UserServiceEnterpriseImpl implements UserService, Serializable { 
    @EJB 
    private UserDAO dao; 
    private User user; 

    @Override 
    public User getCurrentUser() { 
    return user; 
    } 

    @PostConstruct 
    private void initCurrentUser() { 
    user = dao.findByUsername((String)SecurityUtils.getSubject().getPrincipal()); 
    } 
} 

Я работаю с скумбриевидным гидроликом 4.1.1.162.

UPDATE

Вещи, которые я уже пробовал, но не получилось:

  • с помощью тега инициализации-в-порядке в application.xml (устанавливается истина) и изменение порядка из модули,
  • обновление скумбриевидного гидролик до последней доступной сборки (4.1.1.163),
  • вручную развернуть приложение с помощью командной строки (я обычно делаю, что с IntelliJ),
  • удаление «статического» ключевого слова в методе метода BusinessObject # getUserServiceProvider(),
  • все это после того, как я изменил код метода getUserService(), чтобы использовать решение, предоставленное этим ответом https://stackoverflow.com/a/40328987/7090063.

В соответствии с просьбой, здесь представлены мои единственные бобы.XML, которые находятся в моем веб-модуле в SRC/основной каталог/веб-приложение/WEB-INF:

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     version="1.1" bean-discovery-mode="all"> 
    <interceptors> 
    <class>org.senyu.intranet.managedbean.ShiroSecuredInterceptor</class> 
    </interceptors> 
</beans> 

И это резюме структуры моего уха с классами я не говорил до сих пор:

ear 
+-ejb (jar) 
+-entity (jar) 
| +-src 
| +-main 
|  +-java 
|  +-org 
|   +-senyu 
|   +-intranet 
|    +-entity 
|    +-user 
|    | +-UserServiceProviderEnterpriseImpl 
|    +-contrat 
|     +-Contrat // the class extending BusinessObject. 
|       // The latter reside in a dependency 
|       // (core-common-1.0.0-SNAPSHOT.jar). 
|       // The full list is right beneath. 
|       // The UserService and UserServiceProvider 
|       // interfaces also come from this jar. 
+-web 
    +-src 
    +-main 
    | +-java 
    | +-org 
    |  +-senyu 
    |  +-intranet 
    |   +-managedbean 
    |   +-UserServiceEnterpriseImpl 
    |   +-ShiroSecuredInterceptor // @Interceptor class with an @AroundInvoke annotated method 
    +-webapp 
     +-WEB-INF 
     +-beans.xml 

И те баночка упаковали в WEB-INF/Lib каталог моей войны файл:

antlr-2.7.7.jar 
aopalliance-repackaged-2.5.0-b05.jar 
bootstrap-3.3.7-1.jar 
cdi-api-1.1.jar 
classmate-1.3.0.jar 
commons-beanutils-1.8.3.jar 
commons-codec-1.10.jar 
commons-lang3-3.4.jar 
commons-logging-1.2.jar 
core-common-1.0.0-SNAPSHOT.jar // I developed this... 
core-enterprise-1.0.0-SNAPSHOT.jar // ...and that too. 
dom4j-1.6.1.jar 
el-api-2.2.jar 
geronimo-jta_1.1_spec-1.1.1.jar 
gson-2.7.jar 
hibernate-commons-annotations-5.0.1.Final.jar 
hibernate-core-5.2.3.Final.jar 
hibernate-jpa-2.1-api-1.0.0.Final.jar 
hk2-api-2.5.0-b05.jar 
hk2-locator-2.5.0-b05.jar 
hk2-utils-2.5.0-b05.jar 
jackson-annotations-2.8.0.jar 
jackson-core-2.8.3.jar 
jackson-databind-2.8.3.jar 
jandex-2.0.0.Final.jar 
javassist-3.20.0-GA.jar 
javax.annotation-api-1.2.jar 
javax.inject-1.jar 
javax.inject-2.5.0-b05.jar 
javax.ws.rs-api-2.0.1.jar 
jboss-interceptors-api_1.1_spec-1.0.0.Beta1.jar 
jboss-logging-3.3.0.Final.jar 
jersey-client-2.23.2.jar 
jersey-common-2.23.2.jar 
jersey-guava-2.23.2.jar 
jersey-media-jaxb-2.23.2.jar 
jersey-mvc-2.23.2.jar 
jersey-server-2.23.2.jar 
jquery-1.12.4.jar 
jsr250-api-1.0.jar 
log4j-api-2.6.2.jar 
log4j-core-2.6.2.jar 
osgi-resource-locator-1.0.1.jar 
primefaces-6.0.jar 
servlet-api-2.4.jar 
shiro-core-1.3.0.jar 
shiro-web-1.3.0.jar 
slf4j-api-1.6.4.jar 
validation-api-1.1.0.Final.jar 

UPDATE 2

Я создал регистратор для org.weld.jboss в Payara. Вот то, что я получаю, когда он работает:

Sending PAT using the default event resolver: [BackedAnnotatedType] public @Named @SessionScoped class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-001536: Found [] constructors annotated with @Inject for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000002: Exactly one constructor ([EnhancedAnnotatedConstructorImpl] public org.senyu.intranet.managedbean.UserServiceEnterpriseImpl()) defined, using it as the bean constructor for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000004: Exactly one post construct method ([EnhancedAnnotatedMethodImpl] @PostConstruct private org.senyu.intranet.managedbean.UserServiceEnterpriseImpl.initCurrentUser()) for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-001536: Found [] constructors annotated with @Inject for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000002: Exactly one constructor ([EnhancedAnnotatedConstructorImpl] public org.senyu.intranet.managedbean.UserServiceEnterpriseImpl()) defined, using it as the bean constructor for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000012: Building bean metadata for class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000010: Using qualifiers [@javax.enterprise.inject.Default(), @javax.inject.Named(value=userService), @javax.enterprise.inject.Any()] for Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any]]] 
WELD-000014: Using name userService for Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any]]] 
WELD-000016: Using scope interface javax.enterprise.context.SessionScoped for Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any]]] 
WELD-000106: Bean: Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any]]] 
WELD-001538: Created context instance for bean Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any] identified as WELD%ManagedBean%intranet-ear|intranet-web-1.0.0-SNAPSHOT.war|org.senyu.intranet.managedbean.UserServiceEnterpriseImpl|null|false]] 
WELD-001542: Retrieving/generating proxy class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl$Proxy$_$$_WeldClientProxy]] 
WELD-001541: Adding method to proxy: public org.senyu.core.common.user.User org.senyu.intranet.managedbean.UserServiceEnterpriseImpl.getCurrentUser()]] 
WELD-001541: Adding method to proxy: private void org.senyu.intranet.managedbean.UserServiceEnterpriseImpl.initCurrentUser()]] 
WELD-001543: Created Proxy class of type class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl$Proxy$_$$_WeldClientProxy supporting interfaces [interface org.senyu.core.common.user.UserService, interface java.io.Serializable, interface org.jboss.weld.interceptor.proxy.LifecycleMixin, interface org.jboss.weld.interceptor.util.proxy.TargetInstanceProxy, interface org.jboss.weld.bean.proxy.ProxyObject]]] 
WELD-001506: Created new client proxy of type class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl$Proxy$_$$_WeldClientProxy for bean Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any] with ID WELD%ManagedBean%intranet-ear|intranet-web-1.0.0-SNAPSHOT.war|org.senyu.intranet.managedbean.UserServiceEnterpriseImpl|null|false]] 
WELD-001507: Located client proxy of type class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl$Proxy$_$$_WeldClientProxy for bean Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any]]] 
WELD-000200: Looked for WELD%ManagedBean%intranet-ear|intranet-web-1.0.0-SNAPSHOT.war|org.senyu.intranet.managedbean.UserServiceEnterpriseImpl|null|false and got null in [email protected]ef2]] 
WELD-000200: Looked for WELD%ManagedBean%intranet-ear|intranet-web-1.0.0-SNAPSHOT.war|org.senyu.intranet.managedbean.UserServiceEnterpriseImpl|null|false and got null in [email protected]ef2]] 
WELD-000200: Looked for WELD%ManagedBean%intranet-ear|intranet-web-1.0.0-SNAPSHOT.war|org.senyu.intranet.managedbean.UserServiceEnterpriseImpl|null|false and got null in [email protected]ef2]] 
WELD-000200: Looked for WELD%ManagedBean%intranet-ear|intranet-web-1.0.0-SNAPSHOT.war|org.senyu.intranet.managedbean.UserServiceEnterpriseImpl|null|false and got null in [email protected]ef2]] 
WELD-000220: Added WELD_S#WELD%ManagedBean%intranet-ear|intranet-web-1.0.0-SNAPSHOT.war|org.senyu.intranet.managedbean.UserServiceEnterpriseImpl|null|false to session 0fcfe5dc9c8fb5d583f9b90ce7ae]] 
WELD-000202: Added ForwardingBean userService for Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any] with key WELD%ManagedBean%intranet-ear|intranet-web-1.0.0-SNAPSHOT.war|org.senyu.intranet.managedbean.UserServiceEnterpriseImpl|null|false to [email protected]ef2]] 

И когда он не делает:

Sending PAT using the default event resolver: [BackedAnnotatedType] public @Named @SessionScoped class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-001536: Found [] constructors annotated with @Inject for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000002: Exactly one constructor ([EnhancedAnnotatedConstructorImpl] public org.senyu.intranet.managedbean.UserServiceEnterpriseImpl()) defined, using it as the bean constructor for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000004: Exactly one post construct method ([EnhancedAnnotatedMethodImpl] @PostConstruct private org.senyu.intranet.managedbean.UserServiceEnterpriseImpl.initCurrentUser()) for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-001536: Found [] constructors annotated with @Inject for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000002: Exactly one constructor ([EnhancedAnnotatedConstructorImpl] public org.senyu.intranet.managedbean.UserServiceEnterpriseImpl()) defined, using it as the bean constructor for [EnhancedAnnotatedTypeImpl] public @SessionScoped @Named class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000012: Building bean metadata for class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl]] 
WELD-000010: Using qualifiers [@javax.enterprise.inject.Default(), @javax.inject.Named(value=userService), @javax.enterprise.inject.Any()] for Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any]]] 
WELD-000014: Using name userService for Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any]]] 
WELD-000016: Using scope interface javax.enterprise.context.SessionScoped for Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any]]] 
WELD-000106: Bean: Managed Bean [class org.senyu.intranet.managedbean.UserServiceEnterpriseImpl] with qualifiers [@Default @Named @Any]]] 
    HHH000346: Error during managed flush [WELD-001308: Unable to resolve any beans for Type: interface org.senyu.core.common.user.UserService; Qualifiers: [@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()]]]] 
org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: Unable to resolve any beans for Type: interface org.senyu.core.common.user.UserService; Qualifiers: [@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()] 
    at org.senyu.intranet.entity.user.UserServiceProviderEnterpriseImpl.getUserService(UserServiceProviderEnterpriseImpl.java:17) 
Caused by: org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: Unable to resolve any beans for Type: interface org.senyu.core.common.user.UserService; Qualifiers: [@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()] 
    at org.senyu.intranet.entity.user.UserServiceProviderEnterpriseImpl.getUserService(UserServiceProviderEnterpriseImpl.java:17) 
Caused by: org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: Unable to resolve any beans for Type: interface org.senyu.core.common.user.UserService; Qualifiers: [@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()] 
    at org.senyu.intranet.entity.user.UserServiceProviderEnterpriseImpl.getUserService(UserServiceProviderEnterpriseImpl.java:17) 
Caused by: org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: Unable to resolve any beans for Type: interface org.senyu.core.common.user.UserService; Qualifiers: [@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()] 
    at org.senyu.intranet.entity.user.UserServiceProviderEnterpriseImpl.getUserService(UserServiceProviderEnterpriseImpl.java:17) 
+0

ли вы найти способ разрешить это? Я сталкиваюсь с тем же вопросом. –

ответ

0

Использование итератора для поиска бина не является правильным. Набор может быть пустым, подразумевая, что бобы такого типа еще не существуют.

Поскольку вы уже используете CDI 1.1 API, лучше использовать CDI.current().select(UserService.class).get()

+0

Я пробовал ваше решение, но в итоге наблюдал одно и то же случайное поведение, которое я описал. Более конкретно, я получаю это исключение (когда оно не работает): 'org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: Невозможно разрешить любые компоненты для Type: interface org.senyu.core.common.user. UserService; Квалификаторы: [] '. –

+0

Можете ли вы поделиться «beans.xml» всех трех своих модулей @ GabrielBarthélémy? –

+0

Кроме того, вы можете указать, где находится каждый из перечисленных классов в вашем EAR, и если ваш файл WAR содержит все дополнительные JAR-файлы внутри него. –

Смежные вопросы