1

I want to update my password via Thymeleaf. So far, everything works except as soon as I call my update method I get an error message.

This is my code:

    @PostMapping
    public String updateOldPassword(@Valid @ModelAttribute("password") PasswordChange userAndpassword,
                BindingResult result, ModelMap model) {

        if (result.hasErrors()) {
            return "error";
        }

        String username = userAndpassword.getUsername();
        String password = userAndpassword.getPassword();

        String newPassword = passwordEncoder.encode(password);

        passwordRepo.updatePassword(username, newPassword);
        return "redirect:/";
    }

    public interface updateOldPasswordRepository extends JpaRepository<Benutzer, Long>{
        @Modifying
        @Query(value = "UPDATE benutzer SET passwort = ? WHERE benutzername = ?", nativeQuery = true)
        void updatePassword(String benutzername, String passwort);
    }

When it tries to update my password, I get this error message:

ERROR 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.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query] with root cause
javax.persistence.TransactionRequiredException: Executing an update/delete query
    at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1496)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:256)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:590)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:578)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)

Maybe someone can help me, please.

Thanks.

mate00
  • 2,727
  • 5
  • 26
  • 34
Bernd
  • 593
  • 2
  • 8
  • 31

1 Answers1

1

I found the problem. I had to use

@Transactional

too.

Here is the full code:

    public interface updateOldPasswordRepository extends JpaRepository<Benutzer, Long>{
        @Modifying
        @Query(value = "UPDATE benutzer SET passwort = :passwort WHERE benutzername = :benutzername", nativeQuery = true)
        @Transactional
        void updatePassword(@Param("benutzername") String benutzername, @Param("passwort") String passwort);
    }
mate00
  • 2,727
  • 5
  • 26
  • 34
Bernd
  • 593
  • 2
  • 8
  • 31