BindingResult 错误不会显示在 HTML 中

问题描述 投票:0回答:1

填写表单并发送 POST 请求后,我在页面上收到一条错误消息

type=Internal Server Error, status=500

控制台显示以下内容

jakarta.validation.ConstraintViolationException: creatPost.post.heading: Заголовок не может быть пустым
    at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:138) ~[spring-context-6.0.9.jar:6.0.9]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-6.0.9.jar:6.0.9]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:702) ~[spring-aop-6.0.9.jar:6.0.9]

我的控制器类

@Controller
@Validated
@RequiredArgsConstructor
public class PostController {
    private final PostService postService;
    @GetMapping("/")
    public String posts(@RequestParam(name = "heading", required = false) String heading, Model model) {
        List<Post> posts = postService.listPosts(heading);
        Map<Long, String> times = postService.timeFromPosts(posts);
        model.addAttribute("posts", posts);
        model.addAttribute("times", times);
        return "index";
    }

    @GetMapping("/post/creat")
    public String pageCreatPost(Model model) {
        model.addAttribute("post", new Post());
        return "add";
    }

    @PostMapping("/post/creat")
    public String creatPost(@Valid @ModelAttribute("post") Post post,
                            BindingResult bindingResult,
                            @RequestParam("file") MultipartFile multipartFile) throws IOException {
        if (bindingResult.hasErrors()) {
            return "add";
        }
        postService.savePost(multipartFile, post);
        return "redirect:/";
    }

    @PostMapping("/post/delete/{id}")
    public String deletePost(@PathVariable Long id) {
        postService.deletePost(id);
        return "redirect:/";
    }

    @GetMapping("/post/{id}")
    public String postInfo(@PathVariable Long id, Model model) {
        Post post = postService.getPostById(id);
        String data = postService.timeFormatting(post.getDateTime());
        List<ImageDto> imageDtos = postService.listImagesDtos(post);
        model.addAttribute("post", post);
        model.addAttribute("data", data);
        model.addAttribute("images", imageDtos);
        return "post-info";
    }
}

实体

@Entity
@Table(name = "posts")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Post {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "heading")
    @NotEmpty(message = "Заголовок не может быть пустым")
    @Size(max = 50, message = "Заголовок не должен превышать 50 символов")
    private String heading;

    @Column(name = "description", columnDefinition = "text")
    @NotEmpty(message = "Описание не может быть пустым")
    private String description;

    @Column(name = "price")
    @Min(value = 1, message = "Цена должна быть больше 0")
    private int price;

    @Column(name = "address")
    @NotEmpty(message = "Адрес не может быть пустым")
    private String address;

    @Column(name = "phone_number")
    @Pattern(regexp = "^\\+?[0-9]*$", message = "Номер телефона должен содержать только цифры и символ '+'")
    private String phoneNumber;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "post")
    private List<Image> images = new ArrayList<>();

    private LocalDateTime dateTime;

    @PrePersist
    private void init() {
        dateTime = LocalDateTime.now();
    }

    public void addImageToPost(Image image) {
        image.setPost(this);
        images.add(image);
    }
}

查看

<div class="col-9">
    <div class="form-outline mb-4">
        <input type="text" id="heading" name="heading" class="form-control" th:field="*{post.heading}" />
        <span class="error" th:if="${#fields.hasErrors('heading')}" th:errors="*{post.heading}"></span>
    </div>
</div>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>ru.bulletin_board</groupId>
    <artifactId>bulletin_board</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>bulletin board</name>
    <description>bulletin board</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <!--        <dependency>-->
<!--            <groupId>org.hibernate</groupId>-->
<!--            <artifactId>hibernate-core</artifactId>-->
<!--        </dependency>-->

<!--        <dependency>-->
<!--            <groupId>org.springframework.security</groupId>-->
<!--            <artifactId>spring-security-core</artifactId>-->
<!--        </dependency>-->

<!--        <dependency>-->
<!--            <groupId>org.springframework.security</groupId>-->
<!--            <artifactId>spring-security-web</artifactId>-->
<!--        </dependency>-->

<!--        <dependency>-->
<!--            <groupId>javax.servlet</groupId>-->
<!--            <artifactId>servlet-api</artifactId>-->
<!--            <scope>provided</scope>-->
<!--        </dependency>-->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

发送 POST 请求后,如果违反验证,则应在视图中显示验证错误

在大多数来源中,这样的实现

java validation thymeleaf
1个回答
0
投票

同志们,我找到了。您需要从控制器类中删除

@Validated
注释

© www.soinside.com 2019 - 2024. All rights reserved.