Thymeleaf和Spring MVC:PUT请求导致表单中的空值,而相同的代码与POST请求

时间:2016-04-24 10:56:54

标签: spring-boot thymeleaf

我真的很喜欢弹簧靴,百里香和弹簧mvc,我无法解决我的问题。 我将我的真实案例移到一个最小的例子中,以便更容易理解你。

这是我非常简单的“ Customer.java ” - 类:

@Entity
public class Customer {

    @Id
    @GeneratedValue
    private Long id;
    @Column(nullable = false)
    private String firstName;
    @Column(nullable = false)
    private String lastName;

    public Customer() {
        super();
        id = 0l;
    }

    public Customer(String firstName, String lastName) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
    }

    /*GETTER AND SETTER FOR ALL ATTRIBUTES*/

    @Override
    public String toString() {
        return id + ": " + firstName + " " + lastName;
    }
}

我有以下“ MyController.java ” - 类:

@Controller
class MyController{
//....


    @RequestMapping(value = "/new_customer_form.html", method = RequestMethod.GET)
    public ModelAndView getNewCustomerForm() {
        logger.info("NEW Customer Form");
        return new ModelAndView("customer", "customer", new Customer());
    }

    @RequestMapping(value = "/customer_save/{id}.html", method = RequestMethod.PUT)
    public ModelAndView putCustomer(@PathVariable("id") long id, Customer customer,
                                    HttpServletRequest httpRequest) {
        logger.info("PUT Customer: " + customer.toString());
        return new ModelAndView("success");
    }

    @RequestMapping(value = "/customer_save/{id}.html", method = RequestMethod.POST)
    public ModelAndView postCustomer(@PathVariable("id") long id, Customer customer,
                                     HttpServletRequest httpRequest) {
        logger.info("POST Customer: " + customer.toString());
        return new ModelAndView("success");
    }
}

我的客户资源/模板/ customer.html 文件是:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout">
<head>
    <title>Customer : Edit</title>
</head>
<body>
<h1 >Customer : Edit</h1>
<div>
    <form th:action="'customer_save/'+${customer.id}+'.html'" th:object="${customer}"
          th:method="put" role="form">
        <div class="form-group">
            <label >Lastname</label> <input type="text"
                                            th:field="*{lastName}" class="form-control" placeholder="lastName" />
        </div>

        <div class="form-group">
            <label >Firstname</label> <input type="text"
                                             th:field="*{firstName}" class="form-control"
                                             placeholder="firstName" />
        </div>

        <button type="submit" class="btn btn-default">Submit</button>
    </form>
</div>
</body>
</html>

如果我启动我的应用程序(SpringBoot)并在chrome浏览器中使用http://localhost:8080/abwesenheits_microservice/new_customer_form.html url,则会显示用户ui-form。 输入名称(例如Claudia Schiffer)并单击提交按钮后,将显示以下日志:

PUT Customer:0:null null

这是我的问题:为什么在表单请求的情况下表单参数为空?

重要的是:如果我将请求方法从put更改为post(将th:method="put"替换为th:method="post"),它会起作用并导致以下日志:

POST客户:0:Schiffer Claudia

感谢您阅读我的问题。

修改 Thymeleaf&amp; Spring MVC生成一个带有“put”值的隐藏字段,并自动将方法更改为“post”。但仍然没有数据..

在浏览器中生成的html表单是:

<form role="form" method="post" action="customer_save/0.html"><input type="hidden" name="_method" value="put">

        <div class="form-group">
            <label>Lastname</label> <input type="text" class="form-control" placeholder="lastName" id="lastName" name="lastName" value="">
        </div>

        <div class="form-group">
            <label>Firstname</label> <input type="text" class="form-control" placeholder="firstName" id="firstName" name="firstName" value="">
        </div>

        <button type="submit" class="btn btn-default">Submit</button>
    </form>

1 个答案:

答案 0 :(得分:1)

根据M. Deinum的好评,我解决了我的问题。 问题是我需要注册一个HttpPutFormContentFilter

Spring Boot通常会自动执行此操作 - 但仅限于1.3.0。

我的问题是,我在版本 AngelSR6 的pom.xml中加载了spring-cloud(org.springframework.cloud)作为父级。该版本依赖于在版本1.2.8中的spring-boot 。所以这是自动注册过滤器的错误版本。

在查看spring-cloud(http://projects.spring.io/spring-cloud/)的发布列表后,我将版本从“AngelSR6”更改为“ Brixton.RC2 ”,该版本依赖于 spring -boot in 1.3.3版本

现在我的put-request有效:-) 感谢M. Deinum的评论!!