#java #logging #stack-overflow #jboss7.x #slf4j
#java #ведение журнала #переполнение стека #jboss7.x #slf4j
Вопрос:
Окружающая среда:
- Jboss 7.2
- Java 11
Я получаю java.lang.Ошибка StackOverflowError для экземпляра LoggerFactory.getLogger, но я понятия не имею, почему это так. Вместо org.slf4j он получает org.jboss.logmanner, правильно ли это звучит?
Журнал ошибок
08:50:58,787 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (default task-1) Error Rendering View[/principal.xhtml]: javax.enterprise.inject.CreationException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at java.base/java.lang.Class.newInstance(Class.java:584)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.security.NewInstanceAction.run(NewInstanceAction.java:33)
at java.base/java.security.AccessController.doPrivileged(Native Method)
...
Caused by: java.lang.StackOverflowError
at java.base/java.lang.StackStreamFactory$AbstractStackWalker.callStackWalk(Native Method)
at java.base/java.lang.StackStreamFactory$AbstractStackWalker.beginStackWalk(StackStreamFactory.java:370)
at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walk(StackStreamFactory.java:243)
at java.base/java.lang.StackWalker.walk(StackWalker.java:498)
at org.jboss.logmanager@2.1.5.Final-redhat-00001//org.jboss.logmanager.JDKSpecific.findCallingClasses(JDKSpecific.java:72)
at org.jboss.logmanager@2.1.5.Final-redhat-00001//org.jboss.logmanager.ClassLoaderLogContextSelector$1.run(ClassLoaderLogContextSelector.java:93)
at org.jboss.logmanager@2.1.5.Final-redhat-00001//org.jboss.logmanager.ClassLoaderLogContextSelector$1.run(ClassLoaderLogContextSelector.java:91)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at org.jboss.logmanager@2.1.5.Final-redhat-00001//org.jboss.logmanager.ClassLoaderLogContextSelector.getLogContext(ClassLoaderLogContextSelector.java:121)
at org.jboss.logmanager@2.1.5.Final-redhat-00001//org.jboss.logmanager.ThreadLocalLogContextSelector.getLogContext(ThreadLocalLogContextSelector.java:55)
at org.jboss.as.logging@6.0.11.Final-redhat-00001//org.jboss.as.logging.logmanager.WildFlyLogContextSelectorImpl.getLogContext(WildFlyLogContextSelectorImpl.java:56)
at org.jboss.logmanager@2.1.5.Final-redhat-00001//org.jboss.logmanager.LogContext.getLogContext(LogContext.java:301)
at org.slf4j.impl@1.0.3.GA-redhat-2//org.slf4j.impl.Slf4jLoggerFactory.getLogger(Slf4jLoggerFactory.java:37)
at org.slf4j@1.7.22.redhat-2//org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:366)
at org.slf4j@1.7.22.redhat-2//org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:391)
at deployment.accfor2.ear.accfor-back.war//es.caib.accfor.presentation.back.security.SecurityBean.<init>(SecurityBean.java:34)
at jdk.internal.reflect.GeneratedConstructorAccessor124.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
...
at com.sun.jsf-impl@2.3.5.SP2-redhat-00001//com.sun.faces.cdi.ManagedPropertyProducer.evaluateExpressionGet(ManagedPropertyProducer.java:111)
at com.sun.jsf-impl@2.3.5.SP2-redhat-00001//com.sun.faces.cdi.ManagedPropertyProducer.lambda$new$0(ManagedPropertyProducer.java:83)
at com.sun.jsf-impl@2.3.5.SP2-redhat-00001//com.sun.faces.cdi.CdiProducer.create(CdiProducer.java:128)
at com.sun.jsf-impl@2.3.5.SP2-redhat-00001//com.sun.faces.cdi.ManagedPropertyProducer.create(ManagedPropertyProducer.java:61)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.contexts.unbound.DependentContextImpl.get(DependentContextImpl.java:70)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:100)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:700)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.manager.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:800)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.util.Beans.injectBoundFields(Beans.java:336)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:347)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.injection.producer.ResourceInjector$1.proceed(ResourceInjector.java:69)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.injection.producer.ResourceInjector.inject(ResourceInjector.java:71)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:117)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:159)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.util.bean.IsolatedForwardingBean.create(IsolatedForwardingBean.java:45)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.contexts.AbstractContext.get(AbstractContext.java:96)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.contexts.PassivatingContextWrapper$AbstractPassivatingContextWrapper.get(PassivatingContextWrapper.java:76)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:100)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.get(ContextualInstanceStrategy.java:177)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:700)
at org.jboss.weld.core@3.0.5.Final-redhat-00001//org.jboss.weld.module.web.el.AbstractWeldELResolver.lookup(AbstractWeldELResolver.java:107)
SecurityBean
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
@Named
@SessionScoped
public class SecurityBean implements Serializable {
public static final String USER = "user";
protected final Logger log = LoggerFactory.getLogger(getClass()); //Error
...
pom.xml зависимости, которые могут быть связаны
...
<dependency>
<groupId>org.jboss.spec</groupId>
<artifactId>jboss-javaee-8.0</artifactId>
<type>pom</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
...
Эффективный pom.xml
...
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jul-to-slf4j-stub</artifactId>
<version>1.0.1.Final-redhat-3</version>
</dependency>
<dependency>
<groupId>org.jboss.slf4j</groupId>
<artifactId>slf4j-jboss-logmanager</artifactId>
<version>1.0.4.GA-redhat-00001</version>
</dependency>
...
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-ext</artifactId>
<version>1.7.22.redhat-2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
<scope>compile</scope>
</dependency>
...
Комментарии:
1. попробуйте getClass().getSimpleName()
2. Возможно, это связано с этими пунктами 1. Область для slf4j-api должна быть «предоставлена». Простое обращение к регистратору slf4j в коде Java приведет к тому, что для ведения журнала WildFly будет использоваться api slf4j. 2. Привязкой slf4j по умолчанию для WildFly является slf4j-jboss-logmanager. Если есть желание использовать другую привязку, для привязки должна быть установлена область «компиляции». Будет ли это переопределять привязку slf4j-jboss-logmanager по умолчанию?
Ответ №1:
Я не понимаю, почему в журнале не отображается никаких проблем с компонентами jsf, но проблема заключалась в том, что они имеют циклические зависимости друг от друга с помощью инъекций @ManagedProperty. Итак, единственное, что мне нужно сделать, это сделать их независимыми.
SecurityBean
@Named
@SessionScoped
public class SecurityBean {
...
@Inject
@ManagedProperty(value = "#{sessionBean}")
private SessionBean sessionBean;
..
Значение SessionBean
@Named
@SessionScoped
public class SessionBean {
...
@Inject
@ManagedProperty(value = "#{securityBean}")
private SessionBean sessionBean;
...