注册表单未在 Spring Boot 中提交且未命中端点

问题描述 投票:0回答:2

我正在

Spring Boot
和 thymeleaf 中制作注册表单,但它没有提交到数据库。我什至运行了调试器心情,但它没有达到注册的端点。请注意,我的登录和其他功能运行良好。我按照这个here来创建我的注册

如何获取此端点来创建新用户?

register.html

  <form th:action="@{/registration}" th:object="${user}" method="post">

     <p class="error-message" th:if="${#fields.hasGlobalErrors()}"
      th:each="error : ${#fields.errors('global')}" th:text="${error}">Validation
      error</p>

     <div class="form-group"
      th:classappend="${#fields.hasErrors('firstName')}? 'has-error':''">
      <label for="firstName" class="control-label">First name</label> <input
       id="firstName" class="form-control" th:field="*{firstName}" />
      <p class="error-message"
       th:each="error: ${#fields.errors('firstName')}"
       th:text="${error}">Validation error</p>
     </div>
     <div class="form-group"
      th:classappend="${#fields.hasErrors('lastName')}? 'has-error':''">
      <label for="lastName" class="control-label">Last name</label> <input
       id="lastName" class="form-control" th:field="*{lastName}" />
      <p class="error-message"
       th:each="error : ${#fields.errors('lastName')}"
       th:text="${error}">Validation error</p>
     </div>
     <div class="form-group"
      th:classappend="${#fields.hasErrors('email')}? 'has-error':''">
      <label for="email" class="control-label">E-mail</label> <input
       id="email" class="form-control" th:field="*{email}" />
      <p class="error-message"
       th:each="error : ${#fields.errors('email')}" th:text="${error}">Validation
       error</p>
     </div>
     <div class="form-group"
      th:classappend="${#fields.hasErrors('username')}? 'has-error':''">
      <label for="email" class="control-label">Username</label> <input
       id="email" class="form-control" th:field="*{username}" />
      <p class="error-message"
       th:each="error : ${#fields.errors('username')}" th:text="${error}">Validation
       error</p>
     </div>
     <div class="form-group"
      th:classappend="${#fields.hasErrors('password')}? 'has-error':''">
      <label for="password" class="control-label">Password</label> <input
       id="password" class="form-control" type="password"
       th:field="*{password}" />
      <p class="error-message"
       th:each="error : ${#fields.errors('password')}"
       th:text="${error}">Validation error</p>
     </div>
        <!-- 
     
      <div class="form-group">
      <button type="submit" class="btn btn-success">Register</button>
      <span>Already registered? <a href="/" th:href="@{/login}">Login
        here</a></span>
     </div>
      -->
     <div class="form-group">
      <button type="submit" class="btn btn-success">Register</button>
     
     </div>

    </form>

controller.java

@Controller
public class RegisterationController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/register")
    public String getRegisterPage(ModelMap model) {
        User user = new User();
        model.put("user", user);
        return "register";
    }
    
    @PostMapping("/registration")
    public String postRegister(@RequestBody User user,  BindingResult result) {
        User existingUser = userService.findByEmail(user.getEmail());
        if(existingUser != null) {
            result.rejectValue("email", null, "this email is already used");
        }
        if (result.hasErrors()) {
                return "register";
            }
        
        userService.saveNewUser(existingUser);
        return "redirect:/";
    }
}

UserService.java

    public void saveNewUser(User user) {
        User nuser = new User();
        nuser.setUsername(user.getUsername());
        nuser.setEmail(user.getEmail());
        nuser.setPassword(user.getPassword());
        nuser.setFirstName(user.getFirstName());
        nuser.setLastName(user.getLastName());
        // TODO: is this how you set the role of the user? 
        nuser.setRoles((Set<Role>) Arrays.asList(new Role("user")));
        userRepository.save(nuser);
        
        
    }
java spring-boot thymeleaf
2个回答
0
投票

我通过改变两件事解决了这个问题;首先,我创建了一个自定义

saveNewUser() 
,但 JPA 可以更好地管理它,所以我将其更改为这个。

UserService.java

public User save(User user) {
        user.setRoles(new HashSet<Role> (Arrays.asList(new Role("user"))));
        return userRepository.save(user);
        
    }

我还必须将端点更改为这个

controller.java

@PostMapping("/register")
    public String postRegister(User user) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String encodedPassword = passwordEncoder.encode(user.getPassword());
        user.setPassword(encodedPassword);
        userService.save(user);
        return "redirect:/";
    }

0
投票

我遇到了同样的问题,我解决了它,但将此注释添加到了 saveUser 函数中。

@Transactional

还将这一行添加到 application.properties 中:

import jakarta.transaction.Transactional; @Transactional @Override public void saveUser(UserDto userDto) { User user = new User(); user.setName(userDto.getFirstName() + " " + userDto.getLastName()); user.setEmail(userDto.getEmail()); // encrypt the password using spring security user.setPassword(passwordEncoder.encode(userDto.getPassword())); userRepository.save(user); }

© www.soinside.com 2019 - 2024. All rights reserved.