以适当的方式保存记录

时间:2019-05-15 20:50:50

标签: spring-mvc controller thymeleaf

使用Spring-Mvc和Thymeleaf将记录保存到数据库时出现问题。 当我单击记录中的“更新”按钮时,要输入更新表单(包括在下面),所有值均正确放置,但是,当我要提交时,会发生错误。在控制台中没有任何堆栈跟踪,在网页中只有我无法解决的错误。

这是我的代码:

控制器:

@GetMapping("/{maltId}")
public ModelAndView showMalt(@PathVariable("maltId") Long maltId) {
        ModelAndView mav = new ModelAndView("malt/malt-show");
        mav.addObject(maltService.findById(maltId));
        return mav;
}

@GetMapping("/{maltId}/edit")
public String initUpdateMaltForm(@PathVariable("maltId") Long maltId, Model model) {

        model.addAttribute("malt", maltService.findById(maltId));
        return VIEWS_MALT_CREATE_OR_UPDATE_FORM;
    }

@PostMapping("/{maltId}/edit") 
public String processUpdateMaltForm(@Valid Malt malt, BindingResult result, @PathVariable("maltId") Long maltId) {

        if (result.hasErrors()) {
            return VIEWS_MALT_CREATE_OR_UPDATE_FORM;
        } else {
            malt.setId(maltId);
            Malt savedMalt = maltService.save(malt);
            return "redirect:/malt/" + savedMalt.getId();
        }
    }

型号:

@Column(name="malt_name")
private String maltName;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="producer_id")
private Producer producer;

@Column(name="malt_filling")
private int maltFilling;

@Column(name="malt_ebc")
private int maltEbc;

@Column(name="malt_usage")
private String maltUsage;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="country_id")
private Country country;

@ManyToMany(mappedBy="malts")
private Set<Batch> batches;

这是视图:

<body>  
    <form th:object="${malt}" th:action="@{/malt/}" method="post">
        <input type="hidden" th:field="*{id}" />
            <label>Malt name:</label>

            <input type="text" class="form-control" th:field="*{maltName}" />
                <label>Producer:</label>
                <input type="text" class="form-control"
                    th:field="*{producer.producerName}" />

                <label>Country:</label>
                <select class="form-control" th:field="*{country.id}">
                    <option value="0">Select country</option>
                    <option th:each="country : ${countries}"
                        th:value="${country?.id}"
                        th:text="${country?.countryName}">
                        </option>
                </select>

                <label>Malt filling:</label>
                <input type="text" class="form-control"
                    th:field="*{maltFilling}" />

                <label>Malt usage:</label>
                <input type="text" class="form-control"
                    th:field="*{maltUsage}" />

                <label>Malt EBC:</label>
                <input type="number" class="form-control"
                    th:field="*{maltEbc}" />


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

当我按下Submit按钮时,出现此错误:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed May 15 22:46:22 CEST 2019
There was an unexpected error (type=Not Found, status=404).
No message available

我尝试了几种不同的方法,但是没有任何帮助,并且由于控制台中没有stacktrace,所以我不知道这里出了什么问题。

回购链接:https://github.com/fangirsan/maruszka-new

1 个答案:

答案 0 :(得分:1)

没有堆栈跟踪404通常指示没有映射。由于您可能只提供了Controller的一部分,因此我认为这是您所认为的代码所在:

<form th:object="${malt}" th:action="@{/malt/}" method="post">

操作执行到("/malt/"),但是,您的控制器尚未为此映射?! 我希望可以解决此问题:

  <form th:object="${malt}" th:action="@{${'/' + malt.id + '/edit'}}" method="post">
  

更新

看看您的控制器,您的课程上有以下注释

@Controller
@RequestMapping("/malt")
public class MaltController{..

@RequestMapping("/malt")现在将成为保存../malt/{id}/edit'的路径。现在,下面的代码应该可以工作了:

 <form th:object="${malt}" th:action="@{${'/malt/' + malt.id + '/edit'}}" method="post">

  

使用“ @ {$ {...}} ”时

@ {}是一个链接变量,此标记中的内容将附加到应用程序的根上下文中,例如,在堆栈溢出时,@{'/posts'}将产生https://stackoverflow.com/posts

$ {}是一个变量表达式,它将返回String或对象的.toString()值。

如果我们想在@{}链接变量中传递变量,则必须在其中包含${}变量,从而导致:

@{${'/hope/this/helps' + yourVariable}}