【问题标题】:Liferay and JSF2 + Spring integrationLiferay 和 JSF2 + Spring 集成
【发布时间】:2013-11-04 21:46:00
【问题描述】:

我使用 Eclipse > Liferay Project > Portlet > JSF 2.x > Primefaces 创建了一个新项目。然后我试图通过demo 向它添加 Spring Bean 管理。

问题是在部署到 tomcat 7 时,生成的 portlet 会引发异常。

源文件:jndi:/localhost/jsf-test-portlet/WEB-INF/faces-config.xml 原因:类 'org.springframework.web.jsf.el.SpringBeanFacesELResolver' 缺少运行时依赖项:java.lang.NoClassDefFoundError: org/springframework/beans/factory/access/el/SpringBeanELResolver

如果我查看项目“lib”目录,jars 就在适当的位置,在生成的 WAR 中也是如此。所以我不知道问题可能出在哪里。


我的 ivy.xml

<?xml version="1.0"?>
<ivy-module
version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
>
<info module="portlet_primefaces_tmpl" organisation="com.liferay" />

<dependencies defaultconf="default">
    <dependency name="el-api" org="javax.el" rev="2.2" />
    <dependency name="jboss-el" org="org.jboss.el" rev="2.0.1.GA" />
    <dependency name="jsf-api" org="com.sun.faces" rev="2.1.21" />
    <dependency name="jsf-impl" org="com.sun.faces" rev="2.1.21" />
    <dependency name="liferay-faces-bridge-api" org="com.liferay.faces" rev="3.1.3-ga4" />
    <dependency name="liferay-faces-bridge-impl" org="com.liferay.faces" rev="3.1.3-ga4" />
    <dependency name="liferay-faces-portal" org="com.liferay.faces" rev="3.1.3-ga4" />
    <dependency name="liferay-faces-util" org="com.liferay.faces" rev="3.1.3-ga4" />
    <dependency name="primefaces" org="org.primefaces" rev="3.5" />
    <dependency org="org.springframework" name="spring-core" rev="3.2.1.RELEASE"/>
    <dependency org="org.springframework" name="spring-web" rev="3.2.1.RELEASE" />
</dependencies>

我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/portlet-context.xml</param-value>
</context-param>
<context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<!-- Prevent direct access to Facelet view XHTML by the userAgent (browser). -->
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Facelet View XHTML</web-resource-name>
        <url-pattern>*.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>nobody</role-name>
    </auth-constraint>
</security-constraint>
<security-role>
    <role-name>nobody</role-name>
</security-role>

我的面孔-config.xml

<?xml version="1.0"?>
<faces-config version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd">

<lifecycle>
    <phase-listener>com.liferay.faces.util.lifecycle.DebugPhaseListener</phase-listener>
</lifecycle>
<application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>

【问题讨论】:

  • 如果您下载jsf2-spring-portlet 演示的war 并将其部署在您的$LIFERAY_HOME/deploy 文件夹中,那么它是否可以在您的tomcat 环境中运行?
  • 我按照你的建议做了,它与 WAR 完美配合(我可以看到工作申请表)。但是我的在部署时仍然存在这个问题(异常)。

标签: spring jsf liferay portlet


【解决方案1】:

从demo分析WAR,发现里面有7个Spring JARS, 我将剩余的依赖项添加到我的ivy.xml 文件中,然后是“清理/部署”,现在它可以工作了。也许不是所有的 JARS 都是必需的,但这是下一步,删除那些不必要的。

我的ivy.xml 现在看起来像这样:

<?xml version="1.0"?>
<ivy-module
version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
>

<info module="portlet_primefaces_tmpl" organisation="com.liferay" />

<dependencies defaultconf="default">
    <dependency name="jboss-el" org="org.jboss.el" rev="2.0.1.GA" />
    <dependency name="jsf-api" org="com.sun.faces" rev="2.1.21" />
    <dependency name="jsf-impl" org="com.sun.faces" rev="2.1.21" />
    <dependency name="liferay-faces-bridge-api" org="com.liferay.faces" rev="3.1.3-ga4" />
    <dependency name="liferay-faces-bridge-impl" org="com.liferay.faces" rev="3.1.3-ga4" />
    <dependency name="liferay-faces-portal" org="com.liferay.faces" rev="3.1.3-ga4" />
    <dependency name="liferay-faces-util" org="com.liferay.faces" rev="3.1.3-ga4" />
    <dependency name="primefaces" org="org.primefaces" rev="3.5" />
    <!-- Spring dependencies -->
    <dependency name="spring-core" org="org.springframework" rev="3.0.7.RELEASE"/>
    <dependency name="spring-web" org="org.springframework" rev="3.0.7.RELEASE" />
    <dependency name="spring-context" org="org.springframework" rev="3.0.7.RELEASE" />
    <dependency name="spring-beans" org="org.springframework" rev="3.0.7.RELEASE" />
    <dependency name="spring-expression" org="org.springframework" rev="3.0.7.RELEASE" />
    <dependency name="spring-aop" org="org.springframework" rev="3.0.7.RELEASE" />
    <dependency name="spring-asm" org="org.springframework" rev="3.0.7.RELEASE" />
</dependencies>

【讨论】:

  • 很高兴听到您成功了 :) 请注意,jsf2-spring-portlet 演示使用 Maven 来管理依赖项。 pom.xml 描述符仅引用 spring-web 作为依赖项。所有其他与 Spring 相关的 JAR 依赖项都是可传递的,因此它们会自动包含在内。 Ivy 也有能力下载/包含传递依赖,所以我不知道为什么你必须单独列出它们。
  • 关于传递依赖的有趣注释。我正在从头开始创建一个项目,如问题中所述,生成的 JSF2.X 项目随 IVY 一起提供。是否还有其他易于设置或“准备使用”的选项,例如 Eclipse/IVY 方式?例如,我真的很想用 Maven 而不是 IVY 开发 portlet。
  • 新的Liferay IDE 2.0 M2 版本将允许您为 Ant+Ivy 或 Maven 创建项目。如果您选择 Maven,那么它会自动知道要使用哪个 Liferay Faces Maven Archetype
  • 谢谢尼尔的帮助,我去看看;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
相关资源
最近更新 更多