提交表单时出现Spring Boot错误

时间:2018-01-13 20:00:00

标签: spring spring-boot spring-data spring-data-jpa thymeleaf

我正在尝试通过表单向数据库添加表。正在创建的实体称为Album,它有2个字段,Artist和Genre。这两者中的每一个都是独立的实体。这两个字段用@ManyToOne

注释
@ManyToOne
private Artist artist;

@ManyToOne
private Genre genre;

当我提交表单时,这是我得到的错误:

There was an unexpected error (type=Internal Server Error, status=500).
Error during execution of processor 'org.thymeleaf.spring4.processor.attr.SpringOptionFieldAttrProcessor' (album/add:52)

以下代码是我的控制器的一部分:

    @RequestMapping({"/add", "/add/"})
public String adminAlbumAdd(Model model) {
    model.addAttribute("album", new Album());
    model.addAttribute("artists", artistService.list());
    model.addAttribute("genres", genreService.list());
    return "album/add";
}

@RequestMapping( value = "/save", method = RequestMethod.POST )
public String save(@Valid Album album, BindingResult bindingResult, Model model) {
    if(bindingResult.hasErrors()) {
        model.addAttribute("artists", artistService.list());
        model.addAttribute("genres", genreService.list());
        return "album/add";
    } else {
    Album savedAlbum = albumService.save(album);
    return "redirect:/album/view/" + savedAlbum.getAlbumId();
    }
}

以下代码是百万美元模板的一部分:

    <div th:class="form-group" th:classappend="${#fields.hasErrors('artist')}? 'has-error'">
            <label class="col-sm-2 control-label">Artist <span class="required">*</span></label>
            <div class="col-md-10">
                <select class="form-control" th:field="*{artist}">
                    <option value="">Select Artist</option>
                    <option th:each="artist : ${artists}" th:value="${artist.artistId}" th:text="${artist.artistFirstName + ' ' + artist.artistFirstName}">Artists</option>
                </select>
                <span th:if="${#fields.hasErrors('artist')}" th:errors="*{artist}" th:class="help-block">Artist Errors</span>
            </div>
        </div>   

        <div th:class="form-group" th:classappend="${#fields.hasErrors('genre')}? 'has-error'">
            <label class="col-sm-2 control-label">Genre <span class="required">*</span></label>
            <div class="col-md-10">
                <select class="form-control" th:field="*{genre}">
                    <option value="">Select Genre</option>
                    <option th:each="genre : ${genres}" th:value="${genre.genreName}" th:text="${genre.genreName}">Genres</option>
                </select>
                <span th:if="${#fields.hasErrors('genre')}" th:errors="*{genre}" th:class="help-block">Genre Errors</span>
            </div>
        </div>    

导致此错误的原因是什么?

3 个答案:

答案 0 :(得分:2)

该问题与存储库有关。我正在扩展CrudRepository,但id是int类型。一旦我改变了它,它就有用了。

答案 1 :(得分:0)

首先,您可以考虑将<div class="app"> <header></header> <div class="content"> <sidebar></sidebar> <router-outlet> </router-outlet> </div> <footer></footer> </div> 请求的相同映射用作标准,如:

GET/POST

同样@GetMapping("/new") ... @PostMapping("/new") 参数应注释为@Valid Album album。 如果绑定结果有错误,则不应添加模型属性。 (实际上,您不应为@ModelAttribute方法添加任何模型属性。) 您不应该使用POST创建savedAlbum对象。 该方法应为albumService.save()

答案 2 :(得分:0)

我建议不要直接发布到您的数据库对象。你应该创建一个DTO类,比如说AlbumDto,它将像这样映射类:

public class AlbumDto {
...
private long genreId;
private long artistId;

// Getters & Setters

}

然后,您可以将其转换为您的相册对象,在控制器中查找相应的GenreArtist,将其设置在Album对象上,然后保存。