Почему @PostMapping не меняет th: if - PullRequest
0 голосов
/ 06 июня 2019

У меня есть контроллер, подобный этому:

@Controller
public class AuthController {

private final Logger logger= LoggerFactory.getLogger(AuthController.class);

private UserService userService;

public AuthController(UserService userService) {
    this.userService = userService;
}

@GetMapping("login")
public String login(){
    return "auth/login";
}
@GetMapping("/profile")
public String profile(){
    return "auth/profile";
}
@GetMapping("/register")
public String register(Model model){
    model.addAttribute("user",new User());
    model.addAttribute("success",false);
    return "auth/register";
}
@PostMapping("/register")
public String registerNewUser(@Valid User user, BindingResult bindingResult, Model model, RedirectAttributes redirectAttributes){
    if(bindingResult.hasErrors()){
        //show validation errors
        logger.warn("Validation errors were found while registering a new user");
        model.addAttribute("user",user);
        model.addAttribute("validationErrrs",bindingResult.getAllErrors());
        return "auth/register";
    }else{
        User newUser = userService.register(user);
        redirectAttributes
                .addAttribute("id",newUser.getId())
                .addFlashAttribute("success",true);
        logger.info("No validation errors were found while registerning a new user");
        return "redirect:/register";
    }
}
@GetMapping("/activate/{email}/{activationCode}")
public String activate(@PathVariable String email, @PathVariable String activationCode) {
    Optional<User> user = userService.findByEmailAndActivationCode(email,activationCode);
    if( user.isPresent() ) {
        User newUser = user.get();
        newUser.setEnabled(true);
        newUser.setConfirmPassword(newUser.getPassword());
        userService.save(newUser);
        userService.sendWelcomeEmail(newUser);
        return "auth/activated";
    }
    return "redirect:/";
 }
 }

Я вызываю метод registerNewUser, и все время мой регистратор отображает информацию о "Не было обнаружено ошибок проверки при регистрации нового пользователя", потому что выполняется другое тело.Так что, по моему мнению, redirectAttributes.addFlashAttribute («success», true);должен работать правильно.К сожалению, когда я возвращаю "redirect: / register", я получаю новое представление, но без аллергии зависит от атрибута "succes".Это часть моего вида кода:

<div class="row" th:if="${success}">
<div class="col-md-3"></div>
<div class="col-md-6 alert alert-success" role="alert" >
    You have successfully registered with us. Please check your email to 
activate your account.
</div>
<div class="col-md-3"></div>
</div>

<!-- User Registration form -->
<form class="form-horizontal" role="form" method="POST" 
th:action="@{/register}" th:object="${user}" th:if="!${success}">
<div class="row">

Кто-нибудь может помочь мне определить причину отсутствия предупреждения?

1 Ответ

1 голос
/ 06 июня 2019

В пределах registerNewUser() вы перенаправляете на GET /register.Это вызовет следующий метод:

@GetMapping("/register")
public String register(Model model){
    model.addAttribute("user",new User());
    model.addAttribute("success",false);
    return "auth/register";
}

В этом методе вы добавляете атрибут модели success и устанавливаете его на false, фактически переопределяя атрибут перенаправления.

Поскольку RedirectAttributes используются для заполнения Model цели перенаправления, вы можете заключить вызов model.addAttribute(..) в оператор if.Например:

@GetMapping("/register")
public String register(Model model){
    model.addAttribute("user",new User());
    if (!model.containsAttribute("success")) {
        model.addAttribute("success",false);
    }
    return "auth/register";
}

В качестве альтернативы, вы можете оставить атрибут модели в стороне, так как анализатор достаточно умен, чтобы вычислять ${success} до false, когда он отсутствует.Например:

@GetMapping("/register")
public String register(Model model){
    model.addAttribute("user",new User());
    return "auth/register";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...