【问题标题】:Spring Boot CRUD edit profile / updating profileSpring Boot CRUD 编辑配置文件/更新配置文件
【发布时间】:2020-10-09 07:36:04
【问题描述】:

我在尝试了解如何通过 Spring Boot Hibernate 编辑配置文件时遇到了一些麻烦。请注意,此项目不包括 thymeleaf 或 spring security。

我正在尝试获取已登录的用户并获取他的电子邮件实例,以便能够在名为 editProfile.jsp 的 JSP 中对其进行更新。我的欢迎页面上的 My Profile 链接应该获取登录用户的信息并将您带到 editProfile jsp,用户可以在其中编辑信息和更新信息。 到目前为止,我已经尝试了一些方法,但似乎都没有。

我不断收到此堆栈跟踪

    There was an unexpected error (type=Internal Server Error, status=500).
    Neither BindingResult nor plain target object for bean name 'accountForm' available as request attribute
    java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'accountForm' available as request attribute
        at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:153)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:178)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:199)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:164)
        at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:123)
        at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:460)
        at org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:357)
        at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:87)
        at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:83)
        at org.apache.jsp.WEB_002dINF.jsp.editProfile_jsp._jspx_meth_form_005finput_005f0(editProfile_jsp.java:353)
        at org.apache.jsp.WEB_002dINF.jsp.editProfile_jsp._jspx_meth_form_005fform_005f0(editProfile_jsp.java:285)
        at org.apache.jsp.WEB_002dINF.jsp.editProfile_jsp._jspService(editProfile_jsp.java:236)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:113)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
        at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)
        at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
        at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373)
        at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:834)

我以为我已经设置好了所有东西,但显然我没有,所以我决定在这里发布我的问题。

这是我的欢迎页面的图片,因此您可以大致了解我在说什么,右上角的“我的个人资料”链接应该将我带到 editProfile.jsp。您还可以看到,我能够成功添加登录用户名并将其从登录控制器输出到欢迎页面

这是welcome.jsp

    <header id = bal>
        <input type="image" src="images/nav_logo.PNG" name="nav" class="btSubmit" id="nav" />
        <nav>
            <ul id = nav__links>
                <li><a style = 'text-decoration: none' href = > Testing Center </a> </li>
                <li><a style = 'text-decoration: none' href = > Donation Center </a></li>
                <li> <a style = 'text-decoration: none' href = 'https://www.youtube.com/' > Shop </a></li>
                <li><a style = 'text-decoration: none' href = "/welcome/edit/${firstName.email}"> My Profile </a></li>
            </ul>
        </nav>
    
    
    </header>
    <body>
    <p> Welcome, ${firstName.firstName} ${firstName.lastName}</p>
    
    <div class = grid>
        <div id = card1>
            <h1 class = headstuff>Welcome!</h1>
            <p id=" divider1">Practice social distancing by putting space
                between yourself and others. Continue to practice healthy habits,
                like washing your hands for at least twenty seconds and staying home if you are sick,
                to help slow the spread of <a href = https://www.cdc.gov/coronavirus/2019-ncov/index.html style="color:#817ffe;">#COVID19</a>.</p>
            <button id = butt1>Resources</button>
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <button id = butt2>Self-check</button>
    
        </div>
    </div>
    
    <div class = grid id = g2>
        <div class = card2>
            <img class = icon src="images/world.png" >
            <h2 style = 'display: inline-block' class=" sechead"> Global News</h2>
            <p class = pnew>
                Since the beginning of the pandemic, accelerating the development of and equitable access to vaccines,
                diagnostics and therapeutics for COVID-19 has been a priority for WHO.
                Already, we have made remarkable progress.
                </p>
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <form action="/news">
                <input type="submit" class=butt3 value="View"/>
            </form>
        </div>
    
        <div class = card3>
            <img class = icon src="images/flag.png" >
            <h2 style = 'display: inline-block' class=" sechead"> US News</h2>
            <p class = pnew>Since the beginning of the pandemic, accelerating the development of and equitable access to vaccines,
                diagnostics and therapeutics for COVID-19 has been a priority for WHO.
                Already, we have made remarkable progress.
            </p>
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <form action="/news">
                <input type="submit" class=butt3 value="View"/>
            </form>
    
        </div>
    
        <div class = card4>
            <img class = icon src="images/cap.png" id = icon>
            <h2 style = 'display: inline-block' class=" sechead" id = cardt> Georgia News</h2>
            <p class = pnew id = pn>Since the beginning of the pandemic, accelerating the development of and equitable access to vaccines,
                diagnostics and therapeutics for COVID-19 has been a priority for WHO.
                Already, we have made remarkable progress.
            </p>
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <form action="/news">
                <input type="submit" class=butt3 value="View"/>
            </form>
    </div>
    
        <div class = card5>
            <img class = icon src="images/bulld.png" id = ic4>
            <h2 style = 'display: inline-block' class=" sechead" > Athens News</h2>
            <p class = pnew>Since the beginning of the pandemic, accelerating the development of and equitable access to vaccines,
                diagnostics and therapeutics for COVID-19 has been a priority for WHO.
                Already, we have made remarkable progress.
            </p>
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <form action="/news">
                <input type="submit" class=butt3 value="View"/>
            </form>
    
        </div>
    
    </div>
    </body>
    </html>

这是我的登录控制器,看看我如何将数据从登录控制器传递到 welcome.jsp

    @RequestMapping(value = "/login", method = RequestMethod.POST)
        public Object submitLoginIn(@ModelAttribute("login") AccountEntity accountForm, Model model) {
    
            AccountEntity accountInstance = accountRepo.findByEmail(accountForm.getEmail().toLowerCase());
    
            // Password Verifier using Argon2
            Argon2PasswordEncoder argon2PasswordEncoder = new Argon2PasswordEncoder();
            boolean passwordMatch = argon2PasswordEncoder.matches(accountForm.getPassword(), accountInstance.getPassword());
    
            // issue where if i use caps email, throws null pointer exception
            if (accountInstance == null || !passwordMatch) {
                System.out.println("Invalid Email or Password");
                // return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
                return "login";
            } else if (accountInstance.isEnabled() == false) {
                System.out.println("Cant login cause not verified");
                return "login";
            } else {
                System.out.println("account exist");
                model.addAttribute("firstName", accountInstance);
                return "welcome";
            }
    
        }
    }

这是我的欢迎控制器,这可能是问题所在,但我完全是空白

    @Controller
    public class WelcomeController {
    
        AccountRepository accountRepo;
    
        @RequestMapping(value = "/welcome", method = RequestMethod.GET)
        public String showWelcmPage(Model model) {
            return "welcome";
        }
    
        @RequestMapping(value = "welcome/edit/{email}", method = RequestMethod.GET)
        public String getEditUserData(@PathVariable("email") String email, Model model, AccountEntity accountForm) {
    
            model.addAttribute("accountEmail", email);
            return "editProfile";
        }
    
        @RequestMapping(value = "editProfile", method = RequestMethod.GET)
        public String showEditProfilePage(Model model, AccountEntity accountForm) {
            model.addAttribute("email", accountForm.getEmail());
            model.addAttribute("password", accountForm.getPassword());
            return "editProfile";
        }
    
        @RequestMapping(value = "editProfile", method = RequestMethod.POST)
        public String sendEditProfilePage(@ModelAttribute("accountForm") AccountEntity accountForm, Model model) {
            AccountEntity accountInstance = accountRepo.findByEmail(accountForm.getEmail());
    
            accountInstance.setEmail(accountForm.getEmail());
            accountInstance.setPassword(accountForm.getPassword());
    
            accountRepo.save(accountForm);
    
            return "editProfile";
        }
    
        // @RequestMapping(value = "editProfile/{email}", method = RequestMethod.GET)
        // public String Data(@PathVariable("email") String email, Model model) {
        // AccountEntity accountInstance = accountRepo.findByEmail(email);
    
        // model.addAttribute("accountForm", accountInstance);
        // return "editProfile";
        // }
    }

最后但并非最不重要的是我的 AccountEntity

    @Entity(name = "user")
    public class AccountEntity {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        private String firstName;
        private String lastName;
        private String userName;
        private String email;
        private String password;
        // private String gender;
        private Integer age;
        private Date createdDate;
        private boolean enabled;
    
        @Column(updatable = false)
        private String verificationCode;
    
        // Getters and Setters
        public void setId(Long id) {
            this.id = id;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        /*
         * public String getGender() { return gender; }
         * 
         * public void setGender(String gender) { this.gender = gender; }
         */
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getVerificationCode() {
            return verificationCode;
        }
    
        public void setVerificationCode(String verificationCode) {
            this.verificationCode = verificationCode;
        }
    
        public Date getCreatedDate() {
            return createdDate;
        }
    
        public void setCreatedDate(Date createdDate) {
            this.createdDate = createdDate;
        }
    
        public boolean isEnabled() {
            return enabled;
        }
    
        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }
    
    }

【问题讨论】:

    标签: spring spring-boot jsp crud


    【解决方案1】:

    我在欢迎控制器中的 AccountRepository 声明上方缺少@Autowired 注释

    【讨论】:

    • 什么时候出现这个错误?我假设是当您尝试在 editProfile.jsp 中提交表单时。如果我是对的,请显示 jsp。如果不是,说明什么时候抛出异常。
    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 2017-12-21
    • 2022-01-04
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多