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.
3 Réponses :
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.
Merci! utilisé Bootify, sachant que cela aurait pu me faire gagner beaucoup de temps hahah
Vous ne semblez pas injecter le dépôt dans votre contrôleur Register REST?
@Autowired private JPAUserRepository jpaUserRepository;
Je pense qu'il y a trois choses qui pourraient être le problème.
@GeneratedValue
), et vous le définissez à nouveau manuellement et@javax.persistence.Id
et @Id
.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 .
Pourquoi utilisez-vous
@javax.persistence.Id
et@Id
en même temps?