java.lang.IllegalStateException:未找到必需的标识符 属性
java.lang.IllegalStateException: Required identifier property not found
我在尝试将对象保存到 H2 数据库时不断收到此异常。
我要持久化的对象定义如下:
package mypackage.foo.core.jpa.domain;
@Entity
@Getter
@NoArgsConstructor
public class Task implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter
private Long id;
private String name;
private String description;
控制器:
package mypackage.foo.core.web.controller;
@RestController
@RequiredArgsConstructor
public class TaskController {
private final TaskService taskService;
@PostMapping("/api/task/save")
public ResponseEntity<Task> handlePostAddTask(@RequestBody Task task) {
Task savedTask = taskService.save(task);
return new ResponseEntity<>(savedTask, HttpStatus.CREATED);
}
}
我通过 Postman 发送到该端点的负载:
{
"name":"first task",
"description":"some fascinating description"
}
存储库:
package mypackage.foo.core.jpa.repository;
@Repository
public interface TaskDao extends JpaRepository<Task, Long> {
}
应用配置:
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"mypackage.foo.core.jpa.repository"})
@EntityScan(basePackages = {"mypackage.foo.core.jpa.domain"})
public class FooApplication {
public static void main(String[] args) {
SpringApplication.run(FooApplication.class, args);
}
}
Maven 部门:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
我的做法:
第一个想法是,由于 Task
中的 Id
缺少 setter,所以它一直在发生,但它没有帮助。我一直想知道是否可以得到任何提示来解决这个问题?
任何调用 save(task)
的尝试都会导致抛出 IllegalStateException
。
TaskService
中的save(Task task)
本质上是在调用taskDao.save(Task task)
.
我也怀疑是错误的 @Id
注释(我的意思是来自错误的包),但这里不是这种情况。
Use @Data annotation from lombok as given below. This will generate both setter & getter methods. I hope this will resolve the issue.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.Data;
@Entity
@Data
public class Student {
@Id
@GeneratedValue
private long id;
private String firstName;
private String lastName;
@Data Equivalent to @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode.
~Satheesh
原来删除这两行有帮助:
@EnableJpaRepositories(basePackages = {"mypackage.foo.core.jpa.repository"})
@EntityScan(basePackages = {"mypackage.foo.core.jpa.domain"})
当我在切换到 MySql 后注意到相同的体验时,我开始认为问题一定出在我的配置上。我试图用 ComponentScan
替换这些注释,但 IntelliJ 开始抱怨:
Redundant declaration: @SpringBootApplication already applies given @ComponentScan
所以,我的想法是,也许这些 @EnableJpaRepositories
和 @EntityScan
在这里根本没有必要?删除它们有帮助。我不确定为什么。
我在尝试将对象保存到 H2 数据库时不断收到此异常。
我要持久化的对象定义如下:
package mypackage.foo.core.jpa.domain;
@Entity
@Getter
@NoArgsConstructor
public class Task implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter
private Long id;
private String name;
private String description;
控制器:
package mypackage.foo.core.web.controller;
@RestController
@RequiredArgsConstructor
public class TaskController {
private final TaskService taskService;
@PostMapping("/api/task/save")
public ResponseEntity<Task> handlePostAddTask(@RequestBody Task task) {
Task savedTask = taskService.save(task);
return new ResponseEntity<>(savedTask, HttpStatus.CREATED);
}
}
我通过 Postman 发送到该端点的负载:
{
"name":"first task",
"description":"some fascinating description"
}
存储库:
package mypackage.foo.core.jpa.repository;
@Repository
public interface TaskDao extends JpaRepository<Task, Long> {
}
应用配置:
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"mypackage.foo.core.jpa.repository"})
@EntityScan(basePackages = {"mypackage.foo.core.jpa.domain"})
public class FooApplication {
public static void main(String[] args) {
SpringApplication.run(FooApplication.class, args);
}
}
Maven 部门:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
我的做法:
第一个想法是,由于 Task
中的 Id
缺少 setter,所以它一直在发生,但它没有帮助。我一直想知道是否可以得到任何提示来解决这个问题?
任何调用 save(task)
的尝试都会导致抛出 IllegalStateException
。
TaskService
中的save(Task task)
本质上是在调用taskDao.save(Task task)
.
我也怀疑是错误的 @Id
注释(我的意思是来自错误的包),但这里不是这种情况。
Use @Data annotation from lombok as given below. This will generate both setter & getter methods. I hope this will resolve the issue.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import lombok.Data;
@Entity
@Data
public class Student {
@Id
@GeneratedValue
private long id;
private String firstName;
private String lastName;
@Data Equivalent to @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode.
~Satheesh
原来删除这两行有帮助:
@EnableJpaRepositories(basePackages = {"mypackage.foo.core.jpa.repository"})
@EntityScan(basePackages = {"mypackage.foo.core.jpa.domain"})
当我在切换到 MySql 后注意到相同的体验时,我开始认为问题一定出在我的配置上。我试图用 ComponentScan
替换这些注释,但 IntelliJ 开始抱怨:
Redundant declaration: @SpringBootApplication already applies given @ComponentScan
所以,我的想法是,也许这些 @EnableJpaRepositories
和 @EntityScan
在这里根本没有必要?删除它们有帮助。我不确定为什么。