Spring (javax或hibernate)验证失败后如何在JSP中保留变量

Spring (javax或hibernate)验证失败后如何在JSP中保留变量,spring,jsp,spring-mvc,jsp-tags,Spring,Jsp,Spring Mvc,Jsp Tags,因此,在javax或hibernate验证失败后,JSP中的模型变量就消失了 因为我从模型中加载spring消息的代码,如Fillow: <spring:message code="${editUser.role.rolename}"/> 在这种情况下,editUser是由表单操纵的模型对象,rolename属性保存spring messages标记使用的翻译代码 我的实体: @Entity @Table(name = "User") public class BUser {

因此,在javax或hibernate验证失败后,JSP中的模型变量就消失了

因为我从模型中加载spring消息的代码,如Fillow:

<spring:message code="${editUser.role.rolename}"/>
在这种情况下,
editUser
是由表单操纵的模型对象,
rolename
属性保存spring messages标记使用的翻译代码

我的实体:

@Entity
@Table(name = "User")
public class BUser {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @NotEmpty
    @NotBlank
    @Column(name = "username")
    private String username;

    ....

    @ManyToOne
    @JoinColumn(name = "role", unique = true)
    private BRole role;
}
控制器的一部分:

    @Controller
    public class AccountController {

        @RequestMapping(value = "/secure/user/edit/{username}", method = RequestMethod.GET)
        public String editUser(Model model, @PathVariable String username) {
            BUser user = bUserService.getUserByUsername(username);
            if (user != null) {
                user.setPassword(null);
                model.addAttribute("editUser", user);
                model.addAttribute("roles", bUserService.getRoles(false));
                    return "editUser";
                } else {
                    return "404";
                }
        }

        @RequestMapping(value = "/secure/user/edit/{username}", method = RequestMethod.POST)
        public String editProcessUser(Model model, @PathVariable String username, @UserPrincipal BUser login, HttpSession session,
                @Valid @ModelAttribute("editUser") BUser editUser, BindingResult result) {

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

        //some more code after that... never reached after validation error
        }
}
如何正确处理这类问题

谢谢。

应OP的要求,作为答案发布

您可以使用“@SessionAttribute”将模型属性设置为控制器中的会话范围。每当您设置已标识模型属性的值时,它都会将其置于会话中

例如,如果我有一个名为“myBean”的属性,您可以执行以下操作:

@Controller
@RequestMapping("/myApp")
@SessionAttribute("myBean")
public class MyController {
   // ...
   @RequestMapping("/getMyBean")
   public String getMyBean(@ModelAttribute("myBean") MyBean myBean, Model uiModel) {
      uiModel.addAttribute("myBean", new MyBean());
   }
   // ...
}
在这个简单的示例中,
getMyBean()
每次都创建一个
MyBean
的新实例。这不是您可能要做的事情,但请注意,它还设置了模型中的“myBeam”,这会将新创建的
MyBean
放入会话范围。这有几个结果:

  • 对“myBean”所做的任何更改都将是会话范围的
  • 表单不需要提交整个bean来防止该bean的属性
    null
    ,因为Spring现在将更新现有会话版本,并且不会每次都创建一个空的
  • 现在,任何JSP或任何代码都可以获取引用并在会话中使用“myBean”
  • 当您需要在全局范围内提供列表或类似内容时,例如当您需要驱动
    的内容时,这一点特别有用。例如:

    @Controller
    @RequestMapping("/myApp")
    @SessionAttribute({"myBean", "cities"})
    public class MyController {
       // ...
       @RequestMapping("/getMyBean")
       public String getMyBean(@ModelAttribute("myBean") MyBean myBean, Model uiModel) {
          uiModel.addAttribute("myBean", new MyBean());
       }
       // ...
       @ModelAttribute("cities")
       private List<String> createCitiesList() {
          List<String> cities = new ArrayList<String>();
          cities.add("Jacksonville");
          cities.add("Orlando");
          cities.add("Miami");
          cities.add("Tampa");
          return cities;
       }
       // ...
    }
    
    @控制器
    @请求映射(“/myApp”)
    @SessionAttribute({“myBean”,“cities”})
    公共类MyController{
    // ...
    @请求映射(“/getMyBean”)
    公共字符串getMyBean(@ModelAttribute(“myBean”)myBean myBean,Model uiModel){
    addAttribute(“myBean”,newmybean());
    }
    // ...
    @模型属性(“城市”)
    私有列表createCitiesList(){
    List cities=new ArrayList();
    城市。添加(“杰克逊维尔”);
    城市。添加(“奥兰多”);
    城市。添加(“迈阿密”);
    城市。添加(“坦帕”);
    回归城市;
    }
    // ...
    }
    
    在本例中,我们创建了两个
    @SessionAttributes
    ,一个用于“myBean”,另一个用于“cities”。我们还创建了一个标有
    @modeldattribute
    的方法,该方法返回城市名称的
    列表。最终的结果是,我们现在将在会话中自动生成一个城市名称列表,我们可以将其放入任何处理程序方法或直接在JSP中使用。此方法可用于构建和填充任何您想要的内容,包括您的bean(如果需要)

    您可以在此处阅读更多内容:


    将其再次添加到模型中如何?或者将其放入Session@Bart不起作用,如果我这样做,错误消息就会消失。@CodeChimp我用
    试过,但不起作用。或者您的意思是将其添加到控制器中的会话中,在这种情况下,我认为
    c:set
    标记也应该这样做。请显示处理验证的处理程序的控制器代码。
    @Controller
    @RequestMapping("/myApp")
    @SessionAttribute({"myBean", "cities"})
    public class MyController {
       // ...
       @RequestMapping("/getMyBean")
       public String getMyBean(@ModelAttribute("myBean") MyBean myBean, Model uiModel) {
          uiModel.addAttribute("myBean", new MyBean());
       }
       // ...
       @ModelAttribute("cities")
       private List<String> createCitiesList() {
          List<String> cities = new ArrayList<String>();
          cities.add("Jacksonville");
          cities.add("Orlando");
          cities.add("Miami");
          cities.add("Tampa");
          return cities;
       }
       // ...
    }