我正在使用 JPA 和 Spring MVC 开发一个 Web 应用程序,但我遇到了一个关于 Eclipse Persistence 本地化的恼人异常。这是堆栈跟踪:
mars 09, 2014 2:23:06 PM org.apache.catalina.loader.WebappClassLoader findResourceInternal
Infos: Illegal access: this web application instance has been stopped already. Could not load org/eclipse/persistence/internal/localization/i18n/LoggingLocalizationResource_fr.properties. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
mars 09, 2014 2:23:06 PM org.apache.catalina.loader.WebappClassLoader loadClass
Infos: Illegal access: this web application instance has been stopped already. Could not load org.eclipse.persistence.internal.localization.i18n.LoggingLocalizationResource_fr_FR. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
at java.util.ResourceBundle$Control.newBundle(ResourceBundle.java:2566)
at java.util.ResourceBundle.loadBundle(ResourceBundle.java:1436)
at java.util.ResourceBundle.findBundle(ResourceBundle.java:1400)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1296)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:795)
at org.eclipse.persistence.internal.localization.EclipseLinkLocalization.buildMessage(EclipseLinkLocalization.java:60)
at org.eclipse.persistence.internal.localization.EclipseLinkLocalization.buildMessage(EclipseLinkLocalization.java:34)
at org.eclipse.persistence.internal.localization.LoggingLocalization.buildMessage(LoggingLocalization.java:25)
at org.eclipse.persistence.logging.AbstractSessionLog.formatMessage(AbstractSessionLog.java:987)
at org.eclipse.persistence.logging.DefaultSessionLog.log(DefaultSessionLog.java:142)
at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:3480)
at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:4669)
at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:4641)
at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:4617)
at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:4539)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.logout(DatabaseSessionImpl.java:937)
at org.eclipse.persistence.sessions.server.ServerSession.logout(ServerSession.java:776)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.removeSessionFromGlobalSessionManager(EntityManagerSetupImpl.java:511)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.undeploy(EntityManagerSetupImpl.java:2850)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.close(EntityManagerFactoryDelegate.java:267)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.finalize(EntityManagerFactoryDelegate.java:344)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:101)
at java.lang.ref.Finalizer.access$100(Finalizer.java:32)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:190)
由于我是 JPA 和 Spring MVC 的新手,我不知道是什么导致了这个异常。为什么我会出现此异常以及如何解决?谢谢。
最佳答案
我已将 Eclipse WTP 服务器设置为“构建事件后自动发布”。每次自动发布后,我都会遇到与您显示的相同的错误消息。
有两种方法可以解决此问题。
将 Eclipse 服务器设置设置为“从不自动发布”。
添加 Servlet 关闭 Hook ,它会显式关闭 JPA 的 EntityManagerFactory。
您可以轻松地将击倒 Hook 添加到 ServletContextListener。就我而言,这是一个 GuiceServletContextListener,但它应该对任何 ServletContextListener 都有效。
import javax.persistence.EntityManagerFactory;
import javax.servlet.ServletContextEvent;
import javax.servlet.annotation.WebListener;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;
@WebListener
public class BmjServletContextListener extends GuiceServletContextListener {
Injector injector;
public void contextDestroyed(ServletContextEvent servletContextEvent) {
injector.getInstance(EntityManagerFactory.class).close(); // <--- POI !!
super.contextDestroyed(servletContextEvent);
}
public void contextInitialized(ServletContextEvent servletContextEvent) {
super.contextInitialized(servletContextEvent);
}
protected Injector getInjector() {
injector = Guice.createInjector(new MyModule1(), new MyModule2());
return injector;
}
}
关于java - 非法访问异常: Eclipse Persistence Localization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22282800/