如何将会话属性传递到ThymeLeaf表单字段以保存到数据库

时间:2019-02-17 12:57:36

标签: java spring spring-boot thymeleaf

我有一个Thymeleaf表单,当用户登录时,该表单会将数据发送到数据库表。ThymeLeaf模板能够从其分配的控制器捕获登录用户的会话。将数据保存到数据库时。

我需要将表单数据与捕获的会话用户名一起提供,以便使该会话用户名也保存在数据库表中。但是我收到一条错误消息

  

org.springframework.beans.NotReadablePropertyException:无效   bean类的属性“ userName”   [com.example.jobonics.Persistence.model.NewJobs]:Bean属性   'userName'不可读或具有无效的getter方法:   getter的返回类型与setter的参数类型匹配吗?

我有一个控制器来选择用户会话,并将其发送到thymeleaf模板,在我的表单中还有一个隐藏的输入用户字段,用于保存来自控制器的会话对象。为了清楚起见,以下粘贴了我的代码:

eventArgs.GetTouchPoint(this).Position.Y

我的控制器

@RequestMapping(value = "/new_job", method = RequestMethod.GET)
public String newRegistration(ModelMap model) {
    NewJobs newJobs = new NewJobs();
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    ServletRequestAttributes attr = (ServletRequestAttributes)
    RequestContextHolder.currentRequestAttributes();

   //extract user session from HttpSession
    HttpSession session = attr.getRequest().getSession(true);
    //initialize user service to get authenticated user
    User user = userService.findUserByEmail(auth.getName());

    model.addAttribute("newjobs", newJobs);
    //add session captured name as attribute to view
    model.addAttribute("userName", "Welcome " + user.getFullName() + "");
    return "new_job";

@RequestMapping(value = "/save", method = RequestMethod.POST)
public String saveRegistration(@Valid NewJobs newJobs, BindingResult result, 
ModelMap model,
        RedirectAttributes redirectAttributes) {
    if (result.hasErrors()) {
     System.out.println("has errors");
        return "new_job";
    }

    NJS.save(newJobs);


    return "redirect:/new_job";
}
}

NewJobs

<form class="form-horizontal" th:action="@{/save}" th:object="${newjobs}" method="post">

<div class="form-group">
    <div class="col-sm-7">
        <input type="text" class="form-control" th:value="*{userName}" style="display:none">
    </div>
</div>

我的预期输出是将已登录的用户会话对象作为已提交表单的一部分发送到db。我该如何纠正上述错误?

1 个答案:

答案 0 :(得分:0)

我认为错误是您从错误的位置获得了用户名:
th:value="*{userName}"的意思是newjobs.username
但在控制器中,您未将用户名设置为newjobs,而是将其设置为模型属性

让控制器中的更改代码(带有附加的吸气剂)
newjobs.setUserName("Welcome " + user.getFullName())


th:value="${userName}"$,而不是*

注意:
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#expressions-on-selections-asterisk-syntax

  

但是有一个重要的区别:星号语法评估   选定对象上的表达式,而不是整个上下文。那   是,只要没有选定的对象,美元和   星号的语法完全一样。