【问题标题】:Migrating JSF-Application to Weblogic 12将 JSF 应用程序迁移到 Weblogic 12
【发布时间】:2019-07-30 06:37:17
【问题描述】:

我们开发了一个基于 Seam 2 的 Java EE 5 应用程序,它在 Weblogic 11g 上运行。

现在我尝试按照与之前 WLS 相同的步骤,将相同的 WAR 文件部署到新的 Weblogic 12c(本地 Windows 7 机器上的 12.1.1.0),包括部署所需的 JSF 1.2 库。

应用程序的部署和启动工作正常,但是当我在浏览器中打开 URL 时,出现 500 错误,并且日志文件显示以下异常:

java.lang.UnsupportedOperationException
        at javax.faces.application.Application.getResourceHandler(Application.java:287)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:588)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:242)
...

Application类中的操作属于JSF的2.0版本,我不明白为什么容器试图调用它,因为我说使用JSF 1.2。

任何想法导致问题以及如何简单地将现有 Java EE 5 应用程序迁移到 WLS 12?


编辑 1/2/12:既然没有答案,也许一点赏金会有所帮助? ;-) 不认真,有什么我可以提供的细节来帮助我解决这个问题吗?


编辑 1/5/12:与 cj91 请求相关 - 该项目不是基于 Maven,因此没有 POM。但这里是部署描述符 weblogic.xml:

<?xml version='1.0' encoding='UTF-8'?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd">
  <container-descriptor>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
  </container-descriptor>
  <library-ref>
    <library-name>jsf</library-name>
    <specification-version>1.2</specification-version>
    <implementation-version>1.2</implementation-version>
    <exact-match>false</exact-match>
  </library-ref>
</weblogic-web-app>

这是 ant 构建所采用的 jar 列表:

commons-digester.jar
jboss-seam-debug.jar
jboss-seam-excel.jar
jboss-seam-ioc.jar
jboss-seam-mail.jar
jboss-seam-pdf.jar
jboss-seam-rss.jar
jboss-seam-ui.jar
jsf-facelets.jar
jxl.jar
richfaces-impl.jar
richfaces-ui.jar
standard.jar
jstl.jar
jsf-api.jar
commons-collections-3.2.1.jar
commons-lang.jar
jboss-seam.jar
persistence-api.jar
jta.jar
jsf-impl.jar

darkX.jar
glassX.jar
laguana.jar

antlr-runtime.jar
commons-beanutils.jar
core.jar
drools-templates.jar
drools-decisiontables.jar
drools-compiler.jar
drools-api.jar
drools-core.jar
janino.jar
jboss-el.jar
jboss-seam-remoting.jar
jbpm-jpdl.jar
mvel2.jar
richfaces-api.jar

spiffy-with_source-all-0.05.jar
SuperCSV-1.52.jar

commons-logging.jar
dom4j.jar
javassist.jar
cglib.jar
antlr.jar
slf4j-api.jar
slf4j-log4j12.jar
hibernate-core.jar
hibernate-search.jar
hibernate-commons-annotations.jar
hibernate-annotations.jar
hibernate-entitymanager.jar
hibernate-validator.jar
jboss-common-core.jar
concurrent.jar
lucene-core.jar
gwt-servlet.jar

我确信其中的 jar 比需要的多,但这是它当前在 WebLogic 10.3.5 上运行的设置。

我怀疑 jsf 和 jstl jar 是问题的根源,但从战争中删除它们并没有改变任何事情。

问题仍然是 - 为什么 WLS 12 会尝试从 JSF 2.0 执行某些内容?


编辑 1/6/12:我设法解决了最初的问题 - 应用程序仍然无法正常运行(这对我来说仍然很奇怪,因为我没想到会有更新到新版本的 WLS 时更改以前运行的应用程序中的许多内容),但我在此声明此案例已解决。

对于那些感兴趣的人,我做了 - 感谢答案的帮助和一些谷歌搜索这些东西:

将 weblogic.xml 更改为:

<?xml version='1.0' encoding='UTF-8'?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd">
  <container-descriptor>
    <prefer-web-inf-classes>false</prefer-web-inf-classes>
  </container-descriptor>
  <library-ref>
    <library-name>jsf</library-name>
    <specification-version>1.2</specification-version>
    <implementation-version>1.2.9.0</implementation-version>
    <exact-match>true</exact-match>
  </library-ref>
</weblogic-web-app>

从 WEB-INF/lib 中删除了以下 jars:

jsf-impl.jar
jsf-api.jar
persistence-api.jar
jta.jar
jstl.jar

在 faces-config.xml 中将视图处理程序更改为(由于 IllegalStateException,请参阅 here):

<view-handler>org.ajax4jsf.application.AjaxViewHandler</view-handler>

在 persistence.xml 中将查询工厂类更改为(由于 ClassNotFoundException: org.hibernate.hql.ast.HqlToken,参见here

<property name="hibernate.query.factory_class" value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/>

【问题讨论】:

  • 感谢这篇文章以及您为修复它所做的工作!!!我正在尝试做和你一样的事情,这对我帮助很大。 +1!!!

标签: jakarta-ee weblogic seam2 weblogic12c


【解决方案1】:

您应该问自己为什么要升级到较新的容器而不升级您的应用程序。如果答案是“因为代码库太大”并且您的旧容器运行良好,请不要理会它。

但是,有两个可能的错误: 1)您的 web-inf/lib 中是否嵌入了任何 jsf api jar? 2) 你确定你设置了正确的 1.2 支持吗?如果你正在加载 jsf2.0 类,你可能需要使用一个特殊的类加载器,它首先读取 1.2 jars。

编辑: 至少,这些 jars 应该由您的容器提供,并且不应包含在您的 WEB-INF/lib 中:

  • jsf-impl.jar
  • jsf-api.jar
  • persistence-api.jar

我相当肯定这些也会导致问题:

  • jta.jar
  • jstl.jar
  • jsf-facelets.jar

【讨论】:

  • 没有商业原因,生产版本将保留在 WLS 11g 上。我打算尝试新版本,因为他们终于设法发布了 JEE 6 容器。而且我认为它应该能够在不更改代码本身的情况下运行 JEE 5 应用程序。关于你的问题,我会检查罐子,也许这就是问题的根源,我没有使用 jsf2.0,我在 WLS 中进行了与以前完全相同的配置,将 jsf1.2 安装为 lib,然后安装我的应用程序。
  • 一个补充:Application.getResourceHandler() 来自 JSF 2.0 - 那么当 JSF 1.2 被指定为部署描述符中的必需库时,为什么还要调用它呢?
  • 你能发布你的 POM 吗?我几乎可以肯定你遇到了问题 #1
  • 添加了我认为应该删除的 jar 列表
【解决方案2】:

查看http://docs.oracle.com/cd/E24329_01/web.1211/e21049/configurejsfandjtsl.htm 上题为“部署 JSF 1.2 和 JSTL 库”的部分

【讨论】:

  • 我这样做了,只是通过管理控制台。
  • 当您在 Deployments 下查看 localhost:7001/console 时,jsf 是否与库类型一起列出?另外,您的实现版本真的只有 1.2,通常它是一个更具体的数字。另外,你能摆脱 prefer-web-inf-classes 吗?
  • 我确实有它作为图书馆,并且在我申请之前也有订单。是的,我只需要 1.2 - 但是当我将完全匹配设置为 true 时,版本到底是什么(例如可部署库的 MANIFEST 说 1.2.9.0)?而且,我还没有测试将 prefer-web-inf-classes 设置为 true。我只是想知道,为什么在 10.5.3 中具有相同的设置在新的 WLS 下不起作用?
【解决方案3】:

请注意,我们使用的是 MyFaces 和一个非常旧的版本。我们在 WebLogic 12 中使用了类似的东西,并在删除 servlets 行后让它工作(所有这些都在容器描述符节中):

    <prefer-web-inf-classes>false</prefer-web-inf-classes>
    <prefer-application-packages> 
        <package-name>javax.faces.*</package-name>
        <package-name>com.sun.faces.*</package-name>
        <package-name>com.sun.facelets.*</package-name>
        <package-name>org.apache.myfaces.*</package-name>
        <package-name>org.apache.taglibs.*</package-name>
    </prefer-application-packages> 

   <prefer-application-resources> 
       <resource-name>javax.faces.*</resource-name>
        <resource-name>com.sun.faces.*</resource-name>
        <resource-name>com.sun.facelets.*</resource-name>
        <resource-name>org.apache.myfaces.*</resource-name>
        <resource-name>org.apache.taglibs.*</resource-name>

        <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name>
        <resource-name>META-INF/services/com.sun.faces.*</resource-name>
   </prefer-application-resources>

这简直就是一个奇迹。 :-) 希望这对某人有所帮助。

【讨论】:

  • 总是很有趣,再次得到这么老问题的答案,我已经很多年没有使用Weglogic了,但无论如何感谢。
猜你喜欢
  • 2014-02-01
  • 2014-10-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2011-10-08
  • 2011-05-11
相关资源
最近更新 更多