当前位置: 首页 > 知识库问答 >
问题:

在Spring 3.2中,RedirectAttributes真的传递了属性本身吗?正在丢失元素

郝修为
2023-03-14

注意:最终我的目标只是将结果URL从“/公共/学院/注册?param=blah”更改为定制的SEO化URL,如代码所示。如果我走错了路,试图从在POST映射中返回“成功视图”JSP改为使用POST重定向get(这是一种很好的做法),我愿意接受建议。

以下是两种方法:检索并处理注册表的请求后映射,以及成功页面的映射方法。我正在为重定向添加一个flash属性,该属性保存发布到第一个方法的表单。

表单的属性层次结构为<代码>表单-

@RequestMapping(value = "/public/academy/register", method = RequestMethod.POST)
public String processSubmit(Site site, Section section, User user,
        @ModelAttribute @Valid AcademyRegistrationForm form,
        BindingResult result, Model model, RedirectAttributes redirectAttributes) {
    validator.validate(form, result);

    if (site.isUseStates()
            && StringUtils.isBlank(form.getBooker().getState())) {
        result.rejectValue("booker.state",
                "gui.page.academy.attendee.state");
    }

    if (result.hasErrors()) {
        LOG.debug("Form has errors: {}", result.getAllErrors());
        return "common/academy-registration";
    }

    // Form is valid when no errors are present. Complete the registration.
    AcademyRegistration registration = form.toAcademyRegistration();
    academyService.performRegistration(registration, site);

    redirectAttributes.addFlashAttribute(form);

    String redirectUrl = "redirect:/public/academy/register/"
        + registration.getSchedule().getCourse().getContent().getSeoNavTitle() 
        + "-completed";

    return redirectUrl;
}

@RequestMapping(value="/public/academy/register/**-completed", method=RequestMethod.GET)
public String displayRegistrationSuccess(@ModelAttribute("academyRegistrationForm") final AcademyRegistrationForm form)
{
    SortedSet<Vendor> dummy = form.getSchedule().getCourse().getContent().getVendors();
    return "common/academy-registration-success";
}

例外情况如下:

Oct 2, 2013 2:11:31 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.horn.cms.domain.Content.vendors, could not initialize proxy - no Session

共有1个答案

司寇星海
2023-03-14

以下是我假设发生的情况(直到您更新详细信息):

AcademyRegistration registration = form.toAcademyRegistration();
academyService.performRegistration(registration, site);

一些Hibernate是否会延迟查询和检索一些持久实体,即。它们尚未初始化。确实发生的加载可能发生在一些Hibernate会话中(您是否在某处有@Transactional?)。会话已关闭并与延迟加载的对象解除关联。

然后将表单对象添加到重定向属性(RedirectAttributes)中,该对象具有对延迟加载实体的嵌套引用(它将是hibernate代理)。这本身不是问题,因为您所做的只是传递一个引用。

请求处理通过发送302响应完成。然后,您的客户端将发出由displayRegistrationSuccess()处理的新请求,并点击此行

SortedSet<Vendor> dummy = form.getSchedule().getCourse().getContent().getVendors();

在这里,form对象与上一个请求中添加的相同。此引用链中的一个对象是延迟初始化的Hibernate代理。因为该对象不再与会话相关联,Hibernate会抱怨,您会得到异常。

传递(跨越请求边界)依赖于持久状态的对象不是一个好主意。相反,您应该传递一个用于检索实体的ID。另一种方法是在你的academyService方法中完全初始化你的对象。

 类似资料:
  • 我在Camunda有一些复杂的过程,在所有这些过程的最后都有一个接收任务。在接收任务中,我们显示了流程变量的摘要。问题是接收任务是可选的,它不是用户的强制任务,所以用户可以在没有完成接收任务的情况下退出进程。在这种情况下,流程实例的状态保持在活动状态,这会导致我们的报告出现一个糟糕的视图。 我们的目标有什么解决方案吗? 我展示了一个示例进程,它具有我们所有进程的格式。第一步是用户必须完成的数据输入

  • 问题内容: 我在这里有以下xml文档:编辑:(请参见下面的示例) 我正在使用php / SimpleXML将其转换为对象以读取它: 当我使用print_r时,我看到字段的属性,但没有显示可接受值的属性。这是原始xml的示例(我需要value属性): 这是我在print_r时看到的: 为什么没有显示属性的任何线索?提前致谢。 编辑:请求一些xml: 问题答案: 这里的简单答案是不与SimpleXML

  • google cloud bucket中的结果将具有正确的video/mp4 mimetype(这是由浏览器决定的),但仍然无法在浏览器上查看。 编辑: 我也尝试过使用chrome扩展名“Postman”在收到一个可恢复的上传链接后上传一个文件,但它的属性在上传到GCS时也会丢失,所以它似乎与将文件上传到GCS时涉及的JS端无关。

  • 本文向大家介绍关于iOS获取属性你真的了解吗?,包括了关于iOS获取属性你真的了解吗?的使用技巧和注意事项,需要的朋友参考一下 前言 属性对各位iOS开发者来说应该都不陌生,如果iOS中谈到取属性,相信大家都会夸夸其谈,不就是get方法吗?或者大谈kvc取属性的机制。不得不说这些也是对的。这时大家可能就疑惑了,那你还要说啥的!!大家不妨想想,这些都是代码层的实现,其实我们的代码最终都会被编译,然后

  • ...还是只是一种练习? 我问这个是因为我的教授的一个论点:我失去了递归调用函数的信誉,因为我们在课堂上没有讨论递归,我的论点是我们通过学习和方法隐式地学习了它。 我在这里问是因为我怀疑有人有明确的答案。 例如,以下两种方法有何不同: 除了“永远继续”(在实际程序中,当提供无效输入时,它被正确地用于再次提示用户)之外,和之间还有什么根本的区别吗?对于未优化的编译器,它们的处理方式如何不同? 归根结

  • 我们用ElasticSearch做了一个poc,但是在做的时候,我们在集群环境中丢失了数据。我们使用ES2.4.0。 谁能说说我们缺了什么? 我们的设想是: > 使用下面的配置打开弹性服务器1和服务器2,它们位于一个集群中。 服务器上的索引文档-1: curl-xput'20.20.20.5:9200/ert/post/1'-d'{“用户”:“Easlan”,“postdate”:“01-16-2