Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring MVC保留未公开属性模型的值_Spring_Spring Mvc_Modelattribute - Fatal编程技术网

Spring MVC保留未公开属性模型的值

Spring MVC保留未公开属性模型的值,spring,spring-mvc,modelattribute,Spring,Spring Mvc,Modelattribute,我有一个模型课程: public class User{ public String title; public String username; /* setter getter here */ public String toString(){ /* output title and username */ } } 控制器: @RequestMapping("/dummy") public class DummyControlle

我有一个模型课程:

public class User{
    public String title;
    public String username;

    /* setter getter here */

    public String toString(){
        /* output title and username */
    }
}
控制器

@RequestMapping("/dummy")
public class DummyController
{
    private log = Logger.getLogger(this.getClass().getName());

    @RequestMapping(value="binder")
    public String binderInput(Model model){ 
        UserLogin userInit=UserLogin.findUserLogin(1L);
        model.addAttribute("userLogin",userInit);               
        return "binderInput";   
    }

    @RequestMapping(value="binderResult")
    public String binderResult(@ModelAttribute("userLogin") UserLogin userLogin,BindingResult br){
        log.debug("userLogin:"+userLogin);
        return "binderResult";  
    }
}
以及binderInput的视图(jspx):

<form:form action="dummy/binderResult" method="POST" modelAttribute="userLogin">
    title:<form:input path="title" />
    <input type="submit"/>
</form:form>
但事实上我得到了

title:Sir, username:null
是否有办法保留DAO中未编辑的属性值(对于jspx视图中未显示的字段)?

  • 我想到了隐藏字段,但用户名可以在查看html源代码时查看,并且可以对其进行操作,因此我认为它不是解决方案

  • 我已经尝试了
    @SessionAttribute
    ,我认为在会话中保留模型是有意义的,然后spring
    modeldattribute
    将只填充从视图接收到的属性到会话模型。但是它仍然是一样的,标题改为Sir,但是用户名是空的

  • 我阅读了
    @InitBinder
    并尝试
    dataBinder.setAllowedFields(新字符串[]{“title”})
    但它没有帮助,它只是过滤属性,而不保留其他不允许的字段的值

  • 我开始认为我必须手动完成,比如:

        @RequestMapping(value="binderResult")
        public String binderResult(@ModelAttribute("userLogin") UserLogin userLogin,BindingResult br,HttpSession session){
            /* after put DAO model in session in binderInput */
            UserLogin userLoginSession = session.getAttribute("userLoginSession");
            userLoginSession.setUsername(userLogin.getUsername());
                        //further process or save userLoginSession
            log.debug("userLogin:"+userLoginSession);
            return "dummy/binderResult";    
        }
    

    有没有一种方法可以像我最初期望的那样在Spring中保持未编辑属性?

    谢谢你的帮助

    =====================================================

    我的第二点代码,由gouki提出:

    @RequestMapping("/dummy")
    @SessionAttributes({"userSession"})
    public class Dummy2Controller
    {
        private log = Logger.getLogger(this.getClass().getName());
    
        @RequestMapping(value="binder")
        public String binderInput(Model model,HttpSession session){ 
            UserLogin userInit=UserLogin.findUserLogin(1L);
            model.addAttribute("userSession",userInit);             
            return "binderInput";   
        }
    
        @RequestMapping(value="binderResult")
        public String binderResult(@ModelAttribute UserLogin userSession,BindingResult br,HttpSession session){
            log.debug("userSession:"+userSession);
            //further process or save userSession to DB
            return "binderResult";  
        }
    }
    
    并将视图中的modelAttribute更改为userSession

    =========================================================================
    问题已解决
    我读到的一些链接与这个问题的公认答案有关:


  • 您可以添加方法,该方法将在调用每个控制器方法之前填充对象:

    @ModelAttribute("userLogin")
    public UserLogin getUserLogin() {
        return UserLogin.findUserLogin(1L);
    }
    

    加载后,已提交表单中更改的字段将覆盖旧值,在控制器中,您将刷新对象。

    与您的问题没有直接关系,我可能会首先使用Max的方法,但您可以使用Spring Webflow及其对话上下文来保存对象的副本:


    搜索conversationScope,他们不提供直接指向它的链接。

    请显示第二个解决方案的代码。感谢您的回复,我已经更新了问题谢谢!只是别忘了确保在modelAttribute参数之后有BindingResult,否则它就不起作用(CMIIW)。我将更新这个问题,添加一些链接,这些链接可能有助于在方法上调用这个名为modeldattribute的属性。
    @ModelAttribute("userLogin")
    public UserLogin getUserLogin() {
        return UserLogin.findUserLogin(1L);
    }