将JSF-Application迁移到Weblogic 12

时间:2011-12-20 11:01:06

标签: java-ee weblogic seam2 weblogic12c

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

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

应用程序的部署和启动工作正常,但是当我在浏览器中打开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>

这是蚂蚁构建的罐子列表:

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

我确信其中有更多的罐子,但这是当前在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中删除了以下jar:

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"/>

3 个答案:

答案 0 :(得分:1)

您应该问问自己为什么要在不升级应用程序的情况下升级到更新的容器。如果答案是“因为代码库太大”并且您的旧容器工作正常,请不要管它。

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

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

  • JS​​F-impl.jar中
  • JS​​F-api.jar文件
  • 持久性api.jar文件

我很确定这些也会导致问题:

  • jta.jar
  • 的jstl.jar
  • JS​​F-facelets.jar

答案 1 :(得分:0)

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

答案 2 :(得分:0)

请注意,我们正在使用MyFaces和一个非常旧的版本。我们在WebLogic 12中使用了类似的方法,并在删除servlets行后使其工作(所有这些都在container-descriptor节中):

    <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>

这简直就是奇迹。 :-)希望对您有所帮助。