2

我在 liferay 工作。我们在项目中使用一个模块来创建 liferay 主题。我使用命令 ant -Ddeploy.war=true将其部署在服务器中。战争文件在 liferay 部署文件夹中创建。但是当我启动服务器时,我没有任何登录选项。我没有得到任何 Liferay 特定的选项。我得到以下服务器日志

An error occurred at line: 117 in the jsp file: /html/portlet/login/login.jsp
com.alepo.hooks.ConcurrentLoginException cannot be resolved to a type
114:            <liferay-ui:error exception="<%= UserLockoutException.class %>" message="this-account-has-been-locked" />
115:            <liferay-ui:error exception="<%= UserPasswordException.class %>" message="please-enter-a-valid-password" />
116:            <liferay-ui:error exception="<%= UserScreenNameException.class %>" message="please-enter-a-valid-screen-name" />
117:            <liferay-ui:error exception="<%= com.alepo.hooks.ConcurrentLoginException.class %>" message="max-sessions-exceeded" />
118:
119:            <fieldset class="block-labels">
120:                    <div class="ctrl-holder">


Stacktrace:
        at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:93)
        at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
        at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:451)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:328)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:307)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:295)
        at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:565)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:497)
        at com.liferay.taglib.util.IncludeTag.doEndTag(IncludeTag.java:67)
        at org.apache.jsp.html.common.themes.portlet_jsp._jspService(portlet_jsp.java:2669)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)

有什么想法吗?

4

2 回答 2

6

看来您的自定义登录挂钩搞砸了,这不是主题的问题。

如果您仔细阅读错误:

在 jsp 文件中的第 117 行发生错误:/html/portlet/login/login.jsp com.alepo.hooks.ConcurrentLoginException 无法解析为类型

所以发生的事情是/html/portlet/login/login.jsp无法找到ConcurrentLoginException可能驻留在您的钩子中的类,为什么会发生这种情况是因为 liferay 处理类加载的方式。

简而言之,有 3 个类加载器:

  1. 全局(服务器库中的类,tomcat/ext/lib如数据库驱动程序和portal-service.jar):这些类可以被所有插件上下文和 liferay 上下文使用,并且可供所有插件使用。
  2. 门户类加载器(类ROOT/WEB-INF/lib如著名的portal-impl.jar):这些类或实现仅适用于 Liferay 的上下文。
  3. Portlet / Plugin ClassLoader(加载我们插件的类):这些可用于我们的插件(portlet、钩子等),但不适用于 liferay 的模块/上下文。

因此,在这个简短的速成课程之后,您可能已经知道问题所在,但我仍然会尝试回答这个问题(为了积分:-)。

就是这样,因为 JSP-hook 修改了 liferay 的 JSP 并被复制到ROOT它属于 liferay 上下文的目录中,因此在插件中创建的任何自定义类(portlet 或钩子或主题)都对 JSP 不可用,所以在这种情况下login.jsp

因此,要么不要在 JSP 中使用该类 ;-),要么将异常类(打包在 jar 中)放在全局路径中,即tomcat/ext/lib它可用于login.jsp.

这是Liferay 员工对类似问题的裁决和另一个答案,这可能有助于推动这个概念回家并在未来有所帮助。

于 2013-04-06T05:27:54.593 回答
-1

看起来你还没有ConcurrentLoginException在你的/html/portlet/login/login.jsp

假设该类在您的项目中,通过将下面的行放在顶部来ConcurrentLoginException将该类导入:login.jsplogin.jsp

<%@page import="com.alepo.hooks.ConcurrentLoginException"%>

如果ConcurrentLoginException您的项目中不存在类,则使用 Prakash 的方法,这是关于如何映射依赖项的绝佳答案。

于 2014-05-08T09:33:29.407 回答