GlassFish重新启动-现在收到异常,将上下文初始化的事件发送到类的侦听器实例



我是新来的,正在学习Java,因为我负责的两个应用程序都是用Java编写的。但对我来说不幸的是,当我们的网络人员在Linux机器上进行apache升级时,它导致我们的网站和GlassFish中断。此后,他们将Apache恢复到升级前我们运行的版本,同时他们还必须获得SSL的新密钥。

我的环境:物理Linux Suse Enterprise服务器,带有Apache 2.2.10和GlassFish Enterprise server v.2.1.1,运行一个web应用程序&一个企业应用程序。

到目前为止我已采取的步骤:

  1. 将新的SSL导入密钥库
  2. 更新domain.xml以反映alias&密钥存储文件
  3. 重新启动的Derby数据库(也称为JavaDB):asadmin启动数据库--dbhost 0.0.0-dbport 1527
  4. 重新启动GlassFish域:asadmin启动域domain1

由于几个严重错误,应用程序没有运行,其中一个错误与JDBC连接MySQL有关。所以我登录到管理控制台,ping了所有的连接池。MySQL没有连接,所以我在"附加属性"下发现了两件事:serverName的IP地址有一个额外的数字,所以我删除了它。url缺少一个IP地址jdbc:mysql://3306/dbname所以我把它改成jdbc:mysql://127.0.0.1:3306/dbname.我再次ping,这解决了连接问题。

所以我停止并重新启动域,但仍然一无所获。不过,至少我只犯了两个严重的错误。我已经从下面的服务器日志中复制了主要错误消息。另一条消息只是简单地说明应用程序由于以前的错误而无法启动。自从我担任这个职位以来,GlassFish服务器上运行的任何一个应用程序都没有做任何更改,在这次停机之前,管理控制台也没有做任何改变。

到目前为止,解决这些问题对我来说并不是一件容易的事。到目前为止我已经在谷歌上搜索了很多,并找到了很多帮助,但我在下面的问题上运气不佳。似乎我不需要更改实际应用程序上的任何内容,因为它们在此之前就在工作。有什么想法吗?谢谢你抽出时间!

[#|2012-03-02T10:36:22.209-0600|SEVERE|sun-appserver2.1|javax.enterprise.system.container.web|_ThreadID=12;_ThreadName=pool-1-thread-3;_RequestID=317b1d80-3858-4841-bc6a-8e18e9331da8;|WebModule[/Applications]PWC1275: Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener
java.lang.RuntimeException: Could not create Component: org.jboss.seam.core.init
    at org.jboss.seam.init.Initialization.addComponent(Initialization.java:989)
    at org.jboss.seam.init.Initialization.init(Initialization.java:576)
    at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:34)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4655)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5364)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:345)
    at com.sun.enterprise.web.LifecycleStarter.doRun(LifecycleStarter.java:58)
    at com.sun.appserv.management.util.misc.RunnableBase.runSync(RunnableBase.java:304)
    at com.sun.appserv.management.util.misc.RunnableBase._submit(RunnableBase.java:176)
    at com.sun.appserv.management.util.misc.RunnableBase.submit(RunnableBase.java:192)
    at com.sun.enterprise.web.VirtualServer.startChildren(VirtualServer.java:1762)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1244)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:971)
    at com.sun.enterprise.web.LifecycleStarter.doRun(LifecycleStarter.java:58)
    at com.sun.appserv.management.util.misc.RunnableBase.runSync(RunnableBase.java:304)
    at com.sun.appserv.management.util.misc.RunnableBase.run(RunnableBase.java:341)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.security.AccessControlException: access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:107)
    at org.jboss.seam.Component.scanMethod(Component.java:788)
    at org.jboss.seam.Component.initMembers(Component.java:532)
    at org.jboss.seam.Component.<init>(Component.java:254)
    at org.jboss.seam.Component.<init>(Component.java:217)
    at org.jboss.seam.init.Initialization.addComponent(Initialization.java:974)
    ... 21 more
|#]

我能够找到我收到的严重错误的解决方案。对我来说,关键是信息中的一行:Caused by: java.security.AccessControlException: access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)

我在谷歌上搜索了这些单词,无意中发现了Felipe Gaucho写的一篇Java.net博客文章,http://weblogs.java.net/blog/felipegaucho/archive/2010/01/02/glassfish-securitymanagercheckpermission:

将Hudson配置为使用安全管理器在Glassfish中运行之后使我在其他应用程序中开始出现问题,特别是Java中使用反射访问私有字段的web应用程序类。在网上,我注意到很多人在同样的问题(Seam、GWT、Vaadin等)。问题的原因是大多数现代框架都试图访问Java私有字段直接-可能是由于不安全类型的流行语言,或者只是为了更好的性能而设计。框架设计者希望拥有这种自由,但安全管理器强制严格的规则禁止这样做。基于这些框架的应用程序在安全的Glassfish上运行最终会抛出异常。

他接着提出了两种不同的解决方案,#2对我有效。通过在安全策略文件中添加以下代码来抑制GlassFish安全策略中的访问检查:

usr/local/glassfish/domains/domain1/config/server.policy

grant codeBase "file:${com.sun.aas.installRoot}/domains/domain1/applications/your_app_name/-" {
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};

最新更新