0
votes

Insérer des données dans la base de données H2 avec Spring Boot JPA sur la publication

Je souhaite enregistrer des données sur un formulaire d'inscription de mon application Angular dans une base de données H2 aide du démarrage à ressort JPA . Mais lorsque je publie sur Spring Boot pour enregistrer les données utilisateur, j'obtiens une NullPointerException sur la ligne qui appelle la méthode save. Lorsque je renvoie simplement les données utilisateur sans enregistrer les données, cela fonctionne bien, mais pas lors de l'enregistrement des données.

La table créée:

@RestController
public class Register {

private JPAUserRepository jpaUserRepository;

    @PostMapping(path = "/api/register", consumes = "application/json")
    public String addUser(@RequestBody User user) {

        jpaUserRepository.save(user);
        return "succesfull add";
    }

Mon entity :

@Repository
@Transactional
public class JPAUserRepository implements UserRepository {

    @Autowired
    private EntityManager em;

    @Override
    @Transactional
    public void save(User user) {
        em.createNativeQuery("INSERT INTO user (id, first_name, email, last_name, password)" +
                "VALUES (?,?,?,?,?)")
                .setParameter(1, user.getId())
                .setParameter(2, user.getFirstName())
                .setParameter(3, user.getEmail())
                .setParameter(4, user.getLastName())
                .setParameter(5, user.getPassword())
                .executeUpdate();
    }

Mon repository :

@Entity
public class User {

    @javax.persistence.Id
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String firstName;
    private String lastName;
    private String email;
    private String password;
    
    // getters, setters, and constructor, etc.

Le contrôleur où je gère le poste:

Hibernate: 
    
    create table user (
       id integer not null,
        email varchar(255),
        first_name varchar(255),
        last_name varchar(255),
        password varchar(255),
        primary key (id)
    )

Dans le référentiel, j'ai également essayé em.persist(user) mais cela a donné la même erreur.


1 commentaires

Pourquoi utilisez-vous @javax.persistence.Id et @Id en même temps?


3 Réponses :


3
votes

Je ne sais pas d'où vient exactement votre erreur. Mais ce que je remarque: vous insérez votre utilisateur avec l'ID fourni, mais il indique @Generated à l'entité - donc l'ID doit être généré et non fourni. Avec Spring Boot, vous auriez généralement un référentiel comme celui-ci:

public interface UserRepository extends CrudRepository<User, Integer> {
}

Vous n'avez besoin d'aucune méthode supplémentaire - en appelant userRepository.save (..), un utilisateur sera conservé. Je recommanderais de regarder https://bootify.io et de créer une application en cours d'exécution, afin que vous puissiez vérifier ce qui manque également au niveau de la configuration.


1 commentaires

Merci! utilisé Bootify, sachant que cela aurait pu me faire gagner beaucoup de temps hahah



0
votes

Vous ne semblez pas injecter le dépôt dans votre contrôleur Register REST?

@Autowired private JPAUserRepository jpaUserRepository;


0 commentaires

0
votes

Je pense qu'il y a trois choses qui pourraient être le problème.

  1. Vous générez l'id ( @GeneratedValue ), et vous le définissez à nouveau manuellement et
  2. l'utilisation de @javax.persistence.Id et @Id .
  3. EntityManger doit être injecté en tant que @PersistenceContext

Donc,

@Override
@Transactional
public void save(User user) {
    em.createNativeQuery("INSERT INTO user (first_name, email, last_name, password)" +
            "VALUES (?,?,?,?)")
            .setParameter(1, user.getFirstName())
            .setParameter(2, user.getEmail())
            .setParameter(3, user.getLastName())
            .setParameter(4, user.getPassword())
            .executeUpdate();
}

OU très pratique en utilisant directement les dépôts jpa comme indiqué par Thomas .


0 commentaires