我有一个dccr.jsp文件,它通过标记调用一个动作:
<s:action name="query-privilege" executeResult="false" var="privilege">
<s:param name="moduleid">9</s:param>
<s:param name="privilege">v</s:param>
<s:param name="pagename">dccr</s:param>
</s:action>我使用此操作查询用户之间的模块特权,如下所示:
<s:if test="%{#privilege.allowable == false}">
//do something
</s:if>这是我的行动支持课:
private String pagename;
private String moduleid;
private boolean allowable;
private String privilege;
private final UsertypeModuleDAO umodDao = (UsertypeModuleDAO) ServletActionContext.getServletContext().getAttribute("usermoduleDAO");
//loggers, session properties etc.
@Action(value = "/query-privilege", results = {
@Result(name = "SUCCESSdccr", location = "/dccr.jsp"),
@Result(name = "ERROR", location = "../error/messages.jsp")
})
@Override
public String execute() {
try {
char p = privilege.charAt(0);
int i = Integer.parseInt(moduleid);
allowable = queryPrivilege(i, p);
logger.info(privilege+", "+moduleid+", "+ut.getUsertypeid()+", "+allowable);
return SUCCESS + pagename;
} catch (Exception e) {
if (emps != null) {
logger.fatal("(" + emps.getIdnumber() + "):" + e.getLocalizedMessage(), e);
} else {
logger.fatal(e.getLocalizedMessage(), e);
}
e.printStackTrace();
addActionError(e.getLocalizedMessage());
return ERROR;
}
}
private boolean queryPrivilege(int moduleid, char privilege) {
DetachedCriteria criteria = DetachedCriteria.forClass(UsertypeModule.class);
criteria.createCriteria("usertypes", "ut").setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.createCriteria("modules", "m").setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.add(Restrictions.eq("m.moduleid", moduleid));
criteria.add(Restrictions.eq("ut.usertypeid", ut.getUsertypeid()));
UsertypeModule um = umodDao.getPrivilege(criteria);
logger.info(um.getModulename());
boolean p = false;
switch (privilege) {
case 'v': p = um.isViewable();
break;
case 'e': p = um.isEditable();
break;
case 'c': p = um.isCreateable();
break;
case 'd': p = um.isDeleteable();
break;
}
return p;
}
//getters and setters下面是我的数据访问对象中的代码:'umodDao':
@SuppressWarnings("unchecked")
public UsertypeModule getPrivilege(DetachedCriteria dc){
Criteria criteria = dc.getExecutableCriteria(session);
criteria.setMaxResults(1);
return (UsertypeModule) criteria.uniqueResult();
}当我运行我的项目并导航到dccr.jsp时,我会得到以下错误:
May 31, 2011 8:34:52 AM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.StackOverflowError
at java.util.HashMap.get(HashMap.java:300)
at java.lang.Package.getSystemPackage(Package.java:491)
at java.lang.Package.getPackage(Package.java:313)
at java.lang.Class.getPackage(Class.java:698)
at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.isCandidadeClass(SessionTransactionInjectorInterceptor.java:313)
at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateCoreSession(SessionTransactionInjectorInterceptor.java:340)
at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateCoreSession(SessionTransactionInjectorInterceptor.java:361)是的,我使用的是FHP(完全Hibernate插件1.4GA),我的Servlet容器是NetBeans7.0上的Tomcat7.0。我已经困惑了好几天,但每次尝试都失败了,堆栈痕迹指向了FHP插件的SessionTransactionInjectorInterceptor.injectHibernateCoreSession方法。请帮助我,或者说出任何可能让我明白的事情。
我怀疑这个问题与我的tomcat策略有关,因为当我升级到fhp 2.2GA时,我仍然遇到了堆栈溢出错误。
java.security.AccessController.doPrivileged(Native Method)
已经包含在堆栈跟踪中。但这只是一种怀疑。由于这个问题,我无法继续我的工作,所以我正在考虑将我的项目恢复到最近的工作修订版,以便继续我的工作,并最终在我能够修复这个持续存在的问题时提交我的更改。
发布于 2011-05-31 01:22:11
java.lang.StackOverflowError通常意味着没有停止条件的递归调用。我会开始找一个。
发布于 2011-05-31 12:48:36
我刚刚检查了SessionTransactionInjectorInterceptor的代码。
Class.getPackage()的使用在一定程度上导致了这个问题。他们不应该使用getPackage(),而应该从类名中解析包名。
我不知道你怎么能绕开这件事。在遇到问题(即在静态{}块中的某个地方)并调用getPackage()之前,从同一个包加载类应该会有所帮助。
总的来说,struts2不应该使用getPackage,因为它的目的是不同的。(除此之外,没有性能上的好处,但是需要在全局锁上同步)。
发布于 2012-10-18 20:38:35
我有一个和你相似的问题,但不知何故这个问题神奇地解决了自己。每当我运行它时,我都会得到一些非常长的堆栈跟踪,这是StackOverflowException的结果。
我遵循第一个应答者的建议,并在调试模式下运行它,以查看是否有一些没完没了的递归调用。然而,在调试模式下,问题不再出现。
我的理论是,这个堆栈溢出问题与Struts2 FilterDispatcher类有某种联系。
如果您找不到代码中的任何错误,这可能也会发生在您身上。特别是,如果您的Struts2项目更像是一个试用实验,您可以使用很少的代码,而且您知道代码中任何地方都没有使用递归。
https://stackoverflow.com/questions/6182067
复制相似问题