Правильное сохранение записи - PullRequest
0 голосов
/ 15 мая 2019

У меня проблема с сохранением записей в БД с помощью 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

Я пробовал несколько разных подходов, но ничего не помогает, и, поскольку в консоли нет трассировки стека, я понятия не имею, что здесь не так.

Ссылка на репо: https://github.com/fangirsan/maruszka-new

1 Ответ

1 голос
/ 16 мая 2019

Нет трассировки стека 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}}
...