java - java.sql.SQLIntegrityConstraintViolationException:列“msg”不能为空
问题描述
我正在两个实体“事件”和“消息”之间建立一对多的关系。事件是父级,消息是子级。每当我尝试将一行数据插入“消息”时,我总是得到java.sql.SQLIntegrityConstraintViolationException: Column 'msg' cannot be null我当然已经输入了它。当我将 msg 属性设置为可为空时,错误消息变为java.sql.SQLIntegrityConstraintViolationException: Column 'user_name' cannot be null。似乎 mysql 没有从 Postman 那里得到任何参数。一整天都在寻找答案,但找不到答案,请帮助我。以下是代码。
事件实体
package com.example.springsecurityjwt.models;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name ="Event")
public class Event {
@Id
private int eventId;
private int mountainId;
private String event_name;
private String leader;
private Date date;
private int eventType;
private int minNumOfMember;
private int numOfMember;
private String description;
@Column(columnDefinition = "integer default 0")
private int status;
@OneToMany
@JoinColumn(name = "eventId", referencedColumnName = "eventId")
List<Message> messages = new ArrayList<>();
}
消息实体
package com.example.springsecurityjwt.models;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name ="Message")
public class Message {
@Id
private int messageId;
private int eventId;
private String userName;
private String msg;
private Date date;
}
消息服务
@Service
public class MessageService {
@Autowired
private MessageRepository messageRepository;
public Message addMessage(Message message){
return messageRepository.save(message);
}
}
消息控制器
@RestController
@RequestMapping("/message")
public class MessageController {
@Autowired
private MessageService messageService;
@PostMapping("/add")
public Message addMessage(@Validated Message message){
return messageService.addMessage(message);
}
}
依赖项
<?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>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-security-jwt</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
mysql中的消息表在 此处输入图像描述
错误信息
Hibernate: insert into message (date, event_id, msg, user_name, message_id) values (?, ?, ?, ?, ?)
2020-06-28 20:25:37.125 WARN 16204 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1048, SQLState: 23000
2020-06-28 20:25:37.125 ERROR 16204 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : Column 'msg' cannot be null
2020-06-28 20:25:37.140 ERROR 16204 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
java.sql.SQLIntegrityConstraintViolationException: Column 'msg' cannot be null
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) ~[mysql-connector-java-8.0.20.jar:8.0.20]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) ~[mysql-connector-java-8.0.20.jar:8.0.20]
解决方案
你确定你正确解析了 json 吗?我可以看到您正在使用弹簧,那么您可能必须使用@RequestBody
:
@PostMapping("/add")
public Message addMessage(@Validated @RequestBody Message message){
return messageService.addMessage(message);
}
我建议在此处放置一个断点以查看Message
对象是否构造正确。
推荐阅读
- reactjs - 如何在react js中将onchange值一一存储在数组状态中
- azure - 列出存储容器内容时获取 Azure 存储以返回 blob URL
- .net-core - 设置 dotnetcli no_proxy
- c# - 多个 .NET 用户类型在一个 API 路由中登录
- regex - RewriteRule 处理一个域两个文件夹到两个域没有文件夹
- python - Python 范围 + 条件 + 选择
- java - Postman Get 请求返回重复的结果
- python - 如何通过机器人回复触发对话处理程序?[电报机器人] [Python] [python-telegram-bot]
- javascript - 应用程序屏幕变为空白并显示错误(类型错误:分配给常量)
- typescript - Nestjs TypeORM BasicEntity 不遵守命名约定