【发布时间】:2015-05-27 14:13:57
【问题描述】:
我开始使用 Spring-Roo 1.3.1 和 Spring-Security 3.1.7 创建应用程序
我正在使用Spring OpenEntityManagerInViewFilter 来延迟加载我的域对象。
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
到目前为止一切正常。但是,我在从控制器进行重定向时遇到了以下问题:
@RequestMapping(method = RequestMethod.PUT, produces = "text/html")
public String update(@Valid Service service, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) {
if (bindingResult.hasErrors()) {
populateEditForm(uiModel, service);
return "services/update";
}
uiModel.asMap().clear();
serviceRepository.save(service);
return "redirect:/services/" + encodeUrlPathSegment(service.getId().toString(), httpServletRequest);
}
此重定向 return "redirect:/services/" + encodeUrlPathSegment(service.getId().toString(), httpServletRequest); 失败并返回 LazyInitializationException。在提交完成并发生重定向后,它在执行过滤器链期间失败。直接访问时重定向到的 URL 有效。
当使用return "forward:/services/" + encodeUrlPathSegment(service.getId().toString(), httpServletRequest);时,页面加载正常。
我真的不知道为什么使用“重定向”时休眠会话不可用。另一个奇怪的事情是,当为org.springframework.security.web 激活 DEBUG 日志记录时也可以正常工作。
例如log4j.logger.org.springframework.security.web=DEBUG
我已经在互联网上搜索了一些提示,但通常延迟加载在我的应用中运行良好,只是在这种情况下,目前我不完全明白为什么。
欢迎任何 cmets/提示。
谢谢 斯蒂芬
【问题讨论】:
-
做了一些进一步的调查,发现Roo生成的方法“toString”使用的是
ReflectionToStringBuilder.toString方法。这似乎会导致问题,因为在重定向期间会话不适用于此方法。它仅发生在 Spring Security 初始化期间加载的用户域对象上。仍然不知道为什么更新方法中的“转发:”有效..有什么想法吗?有什么区别?
标签: spring-mvc spring-security spring-roo