Spring Boot模型属性意外更改

时间:2018-07-07 12:24:00

标签: java spring spring-mvc spring-boot thymeleaf

我有一个带有Thymeleaf的Spring-boot Java应用程序。当根网页访问过时,将从此控制器显示带有表单的页面。

@Controller
@Scope("session")
public class AController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String queryForm(Model model) {
       model.addAttribute("query", new Query());
       System.out.println("added query to model");
       return "question_page";
    }

    @RequestMapping(value = "/", method = RequestMethod.POST)
    public String querySubmit(@ModelAttribute Query query) {
        System.out.println("button pressed");
        return "result";
    }
}

该表格如下所示。填写表格并点击提交时。我希望先前创建的查询从具有设置内容的请求映射程序的模型传递。但这似乎是一个不同的查询,因为它具有不同的内存地址。

<div clas="queryFrom">
    <form action="#" th:action="@{/}" th:object="${query}" method="post" 
          class="embed-submit-field">
        <input type="text" th:field="*{content}" id="query" list="suggestions" autocomplete="off"
               class="inputField"/>
        <button type="submit" value="Submit" id="submitButton" class="btn">
            <i class="material-icons">search</i>
        </button>
    </form>
</div>

在结果页面上是一个按钮,该按钮触发控制器的以下请求映射器。我希望控制器将获得与内容集相同的查询,但是会得到另一个与内容集不相同的查询。

@RequestMapping(value = "/test", method = RequestMethod.GET)
public String trigger_reload(@ModelAttribute Query query) {
    System.out.println(query.getContent());  // content is null
    return "result";
}

我不确定自己在做什么错。欢迎任何建议。

该问题被标记为possible duplicate of another question。我只是想确保这些问题完全不同。从Thymeleaf正确设置了Content字段。问题是我没有从模型中获取设置了字段的Query类的实例。完全不同的问题!

2 个答案:

答案 0 :(得分:0)

我自己弄清楚了。我只需要将model属性添加到会话中,否则它将丢失。我刚刚在班级顶部添加了@SessionAttributes({ "query" }),就解决了我的问题。

答案 1 :(得分:-1)

您可以采用这种方法。

不要使用th:field,而是使用html id和name。使用th:value

设置值
<input class="form-control"
           type="text"
           th:value="${content}" id="content" name="content" />