Model.addAttribute :无法将“java.util.Arrays$ArrayList”类型的值转换为所需类型“java.lang.String”

Ste*_*her 5 java spring-boot

我想向 Spring 模型添加项目列表。它有时会抛出ConversionFailedException. 有问题的方法:

private void addAuthoritiesToModel(Model model){
    List<Authority> allAuthorities = Arrays.asList(
            Authority.of("ROLE_ADMIN","Admin"),
            Authority.of("ROLE_USER","User")
    );

    model.addAttribute("allAuthorities",allAuthorities);
}
Run Code Online (Sandbox Code Playgroud)

该方法在最后一行抛出。奇怪的是,它只在从特定方法而不是其他方法调用时才这样做。例如,它在这里工作正常:

@GetMapping("/users/new")
public String newUserForm(Model model){
    model.addAttribute("user",User.blank());
    model.addAttribute("newUser",true);
    addAuthoritiesToModel(model);

    return "user_details";
}
Run Code Online (Sandbox Code Playgroud)

但它在这里吹:

@PostMapping(value = {"/users","/profile","/users/{any}"})
public String postUser(@Valid @ModelAttribute("user") User user,
                       BindingResult bindingResult,
                       @RequestParam("newPassword") Optional<String> newPassword,
                       @RequestParam("confirmPassword") Optional<String> confirmPassword,
                       RedirectAttributes redirectAttributes,
                       @PathVariable("any") String pathVariable
                      ){

    if(bindingResult.hasErrors()) {
        if(user.getId()==null)
            redirectAttributes.addAttribute("newUser",true);
        addAuthoritiesToModel(redirectAttributes);
        return "user_details";
    }

...
}
Run Code Online (Sandbox Code Playgroud)

我曾尝试交换Arrays.asList到另一个 List 实现,但这并不能解决问题。它不会解释为什么它在第一种情况下不起作用。

Ube*_*ool 1

Model和之间有区别RedirectAttributes。中的值RedirectAttributes被格式化为字符串。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/mvc/support/RedirectAttributes.html

模型接口的特化,控制器可以使用它来选择重定向场景的属性。由于添加重定向属性的意图非常明确——即用于重定向 URL,因此属性值可以格式化为字符串并以这种方式存储,以使它们有资格附加到查询字符串或扩展为 org 中的 URI 变量.springframework.web.servlet.view.RedirectView。

除非需要重定向,否则不应使用,在这种情况下应该是字符串值。