Java 如何将session属性传递给ThymeLeaf表单字段以保存到数据库中

Java 如何将session属性传递给ThymeLeaf表单字段以保存到数据库中,java,spring,spring-boot,thymeleaf,Java,Spring,Spring Boot,Thymeleaf,我有一个Thymeleaf表单,在用户登录时将数据发送到数据库表。ThymileAF模板能够从其分配的控制器捕获登录用户的会话。将数据保存到数据库时 我需要将表单数据与捕获的会话用户名一起提供,以便所述会话用户名也保存在数据库表中。然而,我得到一个错误,说 org.springframework.beans.NotReadablePropertyException:无效 bean类的属性“userName” [com.example.jobonics.Persistence.model.NewJ

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

我需要将表单数据与捕获的会话用户名一起提供,以便所述会话用户名也保存在数据库表中。然而,我得到一个错误,说

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

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

@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";
}
}
我的控制器

<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。如何更正上述错误?

我认为错误在于您的用户名来自错误的位置:
th:value=“*{userName}”
mean
newjobs.userName

但在控制器中,您并没有将username设置为
newjobs
,而是设置为model属性

让我们更改控制器中的代码(使用附加getter)
newjobs.setUserName(“欢迎”+user.getFullName())


th:value=“${userName}”
$
但不是
*

注:

不过有一个重要的区别:星号语法计算 选定对象上的表达式,而不是整个上下文上的表达式。那个 只要没有选定的对象,美元和 星号语法的作用完全相同


我认为错误在于您从错误的位置获取用户名:
th:value=“*{userName}”
mean
newjobs.userName

但在控制器中,您并没有将username设置为
newjobs
,而是设置为model属性

让我们更改控制器中的代码(使用附加getter)
newjobs.setUserName(“欢迎”+user.getFullName())


th:value=“${userName}”
$
但不是
*

注:

不过有一个重要的区别:星号语法计算 选定对象上的表达式,而不是整个上下文上的表达式。那个 只要没有选定的对象,美元和 星号语法的作用完全相同



你能发布
NewJobs
类的代码吗?@AK47用NewJobs类检查更新的问题检查我的答案它不起作用。我设置了getter/setter方法来表示
userName
,但是发送到数据库表的值显示为空。在将
user.getFullName()的值添加到模型之前,您是否尝试打印出该值以查看该值是多少?它是空的吗?你能发布
NewJobs
类的代码吗?@AK47用NewJobs类检查更新的问题检查我的答案它不起作用。我设置了getter/setter方法来表示
userName
,但是发送到数据库表的值显示为空。在将
user.getFullName()的值添加到模型之前,您是否尝试打印出该值以查看该值是多少?它是空的吗?坏了。表单向数据库表提交空值。表单不能直接向数据库表提交值。它将数据提交给控制器中的(POST)操作。在这里,我认为它应该向控制器发布有效数据。您能告诉我您处理POST表单的操作,以及您如何将数据保存到数据库吗?在您的
保存中,使用控制器
新作业中的操作save
检查我更新的代码块
操作不包含
用户名
(您的新作业实体没有用户名属性)。您需要将
userName
属性添加到
newJobs
中,或将附加参数发送到
NJS.save
,例如
NJS.save(newJobs,userName)
,其中userName从会话中获取直到不起作用,因为
userName
无法解析为变量
不起作用。表单向数据库表提交空值。表单不能直接向数据库表提交值。它将数据提交给控制器中的(POST)操作。在这里,我认为它应该向控制器发布有效数据。您能告诉我您处理POST表单的操作,以及您如何将数据保存到数据库吗?在您的
保存中,使用控制器
新作业中的操作save
检查我更新的代码块
操作不包含
用户名
(您的新作业实体没有用户名属性)。您需要将
userName
属性添加到
newJobs
中,或将附加参数发送到
NJS.save
,例如
NJS.save(newJobs,userName)
,其中userName从会话中获取直到不起作用,因为
userName
无法解析为变量
@Entity
@Table(name = "newjobs")
public class NewJobs {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int job_id;

@Column(name = "Employer")
private String Employer;

@Column(name = "JobTitle")
@NotEmpty(message = "Please provide the job title")
private String jobTitle;

@Column(name = "job_summary", length = 1000)
private String jobSummary;

@Column(name = "job_description", length = 1000)
private String jobDescription;

@Column(name = "location")
private String Location;

@Column(name = "career_level")
@NotEmpty(message = "Please provide career level required")
private String careerLevel;

@Column(name = "industry")
private String industry;

@Column(name = "profession")
@NotEmpty(message = "Please provide the profession")
private String profession;

@Column(name = "jobtype")
@NotEmpty(message = "Please provide your job type")

private String jobType;
@Column(name = "min_experience")
@NotEmpty(message = "Please provide the Min years of experience")

private String minExperience;
@Column(name = "min_qualification")
@NotEmpty(message = "Please provide the Min Qualifications")
private String minQualification;

@Column(name = "salary")
@NotEmpty(message = "Please provide the salary")
private String salary;

@Column(name = "deadline_date")
@NotEmpty(message = "Please provide the Applications Deadline")
private String deadlineDate;

@Column(name = "created_at", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP", insertable = false, nullable = false)
private Date created_at;
}`