java.lang.IllegalStateException: обязательное свойство идентификатора не найдено - PullRequest
0 голосов
/ 02 октября 2019

Я получаю это исключение, пока пытаюсь сохранить объект в базе данных 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);
    }
}

Полезная нагрузка, которую я отправляю на эту конечную точку через почтальона:

{
    "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 Deps:

<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>

Мой подход: Первая идея состояла в том, что это произошло из-за отсутствия установщика для Id в Task, но это не помогло. Мне было интересно, могу ли я получить какие-либо советы, как решить эту проблему? Любая попытка вызвать save(task) вызывает сброс IllegalStateException.

save(Task task) в TaskService, по сути, вызывает taskDao.save(Task task).

Я также подозревал, что неправильно@Id аннотация (я имею в виду не из того пакета), но здесь дело не в этом.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Оказывается, что удаление этих двух строк помогло:

@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 здесь не нужны в конце концов? Удаление их помогло. Я не уверен, почему.

0 голосов
/ 06 октября 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...