填写表单并发送 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 请求后,如果违反验证,则应在视图中显示验证错误
在大多数来源中,这样的实现
同志们,我找到了。您需要从控制器类中删除
@Validated
注释