【问题标题】:Spring MVC update ModelAttribute valueSpring MVC 更新 ModelAttribute 值
【发布时间】:2018-06-30 19:14:17
【问题描述】:

当修改列为SessionAttributeModelAttribute 时,为什么它不保留其新值?

每次我向下面的示例发出请求时,它都会打印出“初始值。”,这是第一个请求的正确值。但是在第一次请求之后,它的值应该是“新值”。

为什么ModelAttribute 不存储它的值?

我有一个基类。所有扩展它的 servlet:

@SessionAttributes(value = {"test_string", "something"})
public abstract class Base<T>
    {
    public abstract T request(
            @ModelAttribute("test_string") String _test_string,
            ModelAndView _mv);

    @ModelAttribute("test_string")
    private String getTest()
    {
        return "Initial value.";
    }
}

我有一个特定的 servlet:

@Controller
public class InterfaceController extends Base<String>
{
    @PostMapping(value = "/interface")
    @ResponseBody
    @Override
    public String request(
        @ModelAttribute("test_string") String _test_string,
        ModelAndView _mv)
    {
        System.out.println(_test_string);
        _test_string = "new value";

        return "whatever content";
    }
}

【问题讨论】:

    标签: java spring-mvc session modelattribute


    【解决方案1】:

    我不是 Spring MVC 专家,但您的问题似乎是理解 Java 引用传递和字符串不变性。我制作了一个图表来帮助您了解问题所在,但您可能需要研究更多相关信息。

    1. 当您调用 sysout 时,您正在打印“_test_string”(方法参数)指向的值,此时与 ModelAttribute “test_string”相同。

    2. 当您将“新值”分配给“_test_string”(方法参数)时,请注意您并未更改“test_string”(ModelAttribute)的值

    3. 我认为你必须这样做才能覆盖存储在模型中的值。

    【讨论】:

    • 我认为它甚至与 String immutabilty 无关,因为该值尚未重新分配。
    • 好的,有道理。因此,如果我必须返回一个字符串(因为我正在使用 Gson 渲染 json),我该如何更新模型?如果不可能,那么不太优雅的方法是代替 String,返回更新后的 ModelAndView,并将 String Json 传递给视图。如何?我尝试使用 MappingJackson2JsonView 并将整个模型渲染为 Json,这不是一个好主意。
    • 这是一个不同的问题。正如我所说,对不起,我不是 Spring MVC 专家。但我不明白你的新问题。如果您需要在控制器和视图之间传递一个简单的字符串,您可以使用我的第 (3) 点语句或其他类似方法。您可以在视图中恢复属性“test_string”。如果你使用 Json 来表示你所有的模型,我想你可以使用一些库来提取你需要的特定数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2017-11-27
    • 2012-01-01
    • 2021-04-22
    相关资源
    最近更新 更多