当前位置: 首页 > 知识库问答 >
问题:

Thymeleaf spring boot的模型属性为空

葛昕
2023-03-14

我犯了一个让我发疯的奇怪错误。我有一个控制器,它有两个不同的Get方法,用于两个不同的url映射。URL1工作得非常好,我明白URL2的作用

[THYMELEAF][http-nio-8080-exec-3]异常处理模板“QuestionnaReform”:处理器组织执行期间出错。百里香。标准加工机attr。java导致的StandardEachAttrProcessor(问题:10)。lang.NullPointerException:在组织中为null。百里香。上下文WebSessionVariablesMap。hashCode(WebSessionVariablesMap.java:276)~[thymeleaf-2.1.4.RELEASE.jar:2.1.4.RELEASE]

经过几个小时的检查每一行,很明显,我的控制器获取方法在调用视图之前向Model.add属性添加了一个非空对象。我还从模板中删除了所有代码,并添加了以下内容进行故障排除:

<tr th:each="var : ${#vars}">
<td th:text="${var.key}"></td>
<td th:text="${var.value}"></td>

这也返回了相同的空错误!我在网上唯一能找到的就是Thymeleaf2.1的一个bug。4这是由于没有HttpSession对象造成的https://github.com/thymeleaf/thymeleaf/issues/349

但话说回来,我的URL1工作正常!我没有在这里发布任何代码,因为我不知道还有什么可以发布,请询问!

编辑:添加了控制器代码。/admin/问题是正常工作的URL1,'/admin/问卷'是不工作的URL2。

@Controller
public class AdminController {
private QuestionRepository questionRepository;
private EQuestionnaireRepository eQuestionnaireRepository;
private EQuestionnaire eQuestionnaire;


@Autowired
public AdminController(QuestionRepository questionRepository,
                       EQuestionnaireRepository
                       eQuestionnaireRepository){
    this.questionRepository = questionRepository;
    this.eQuestionnaireRepository = eQuestionnaireRepository;
    eQuestionnaire = eQuestionnaireRepository.findAll().get(0);

}

@RequestMapping(value = "/admin/questions", method=RequestMethod.GET)
        public String questionForm(Model model) {
        model.addAttribute("question", new Question());
        return "questionForm";

}//-->This Works fine

@RequestMapping(value = "/admin/questions", method=RequestMethod.POST)
public String saveQuestion(@ModelAttribute Question newQuestion, BindingResult bindingResult, Model model) {
    if( bindingResult.hasErrors())
    {
        System.out.println(bindingResult);
        System.out.println("BINDING RESULTS ERROR");
        return "questionForm";
    }
    questionRepository.save(newQuestion);
    return "questionForm";
}

@RequestMapping(value = "/admin/Questionnaires", method=RequestMethod.GET)
public String QuestionnaireForm(Model model){
model.addAttribute("ListofQ",eQuestionnaire.getQuestionList());
    return "questionnaireForm";

更新:我换到了thymeleaf 2.1.5-SNAPSHOT,现在我没有得到前面提到的错误-但是一个不同的错误:

There was an unexpected error (type=Internal Server Error, status=500).
Exception evaluating SpringEL expression: "ask.questionText"     
(questionnaireForm:13)

现在,模板中的对象引用为null。当我把它放到模型中时,它不是空的(我已经在GET方法中的getQuestionText方法中找到System.out,所以这是确定的),这是我在模板中尝试的简单代码:

<table>
  <tr th:each= "ask : ${ListofQ}"></tr>
  <tr th:text= "${ask.questionText}"></tr>
</table>

问题是:

@Entity
@Table(name = "Questions")
public class Question {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long ID;
private int sequence;
private String questionText;
private int weightage;
private String option1 = "option1";
private String option2 = "option2";
private String option3 = "option3";

public Question() {

}
public Long getID() {
    return ID;
}
public void setID(Long iD) {
    ID = iD;
}

public int getSequence() {
    return sequence;
}
public void setSequence(int sequence) {
    if (sequence > 0) this.sequence = sequence;
}
public String getQuestionText() {
    return questionText;
}
public void setQuestionText(String questionText) {
    this.questionText = questionText;
}
public int getWeightage() {
    return weightage;
}
public void setWeightage(int weightage) {
    this.weightage = weightage;
}

public void setOption1(String option1) {
    this.option1 = option1;

}
public void setOption2(String option2) {
    this.option2 = option2;

}
public void setOption3(String option3) {
    this.option3 = option3;

}
public String getOption1() {
    return option1;
}
public String getOption2() {
    return option2;
}
public String getOption3() {
    return option3;
}

共有2个答案

有宏峻
2023-03-14

您没有将模型对象返回给Thymeleaf。

试着这样做:

@RequestMapping(value = "/admin/Questionnaires", method=RequestMethod.GET)
public ModelAndView QuestionnaireForm(Model model){
    return return new ModelAndView("questionnaireForm", "ListofQ",eQuestionnaire.getQuestionList());
}
束阳旭
2023-03-14

“each”中的输出需要在同一个语句中,我认为这将适合您

<table>
  <tr th:each= "ask : ${ListofQ}" th:text= "${ask.questionText}"></tr>
</table>
 类似资料:
  • 我有一个具有登录功能的控制器类。当我输入用户名和密码并按submit时,它将调用此控制器并在会话中存储客户信息。但有一件事让我感到困惑,那就是@model属性 我将使用@ModelAttribute Customer存储我输入的用户名和密码,并使用Customer c存储我从customService获得的所有信息,并将其存储到会话中。但是会话存储的是客户。 如果我这样改变论点。它工作正常

  • 模型和一些关联具有一个或多个属性,每个属性有类型以及一些可选设置,你可以自行选择它们(或使用默认设置)。 类型 受支持的类型是: text:文本字符串; number:浮点数。你可以指定size为2 | 4 | 8; integer:整数。你可以指定size为2 | 4 | 8; boolean:true或false的值; date:日期对象。你可以指定time为true; enum:一个备选列表

  • 以前我使用过的ORM将数据库列直接映射到类属性,这允许您查看特定的属性可见性,就像您通常会限制对某些属性(例如密码)的访问一样。 有了雄辩,我似乎无法复制这一点,因为数据库列映射到不包含可见性的内部属性数组。 我的愿望是将用户密码的访问范围仅限于对象,即私有。 设置具有可见性的类属性不起作用,因为该属性超出了雄辩模型属性的范围,因此该属性未映射到列。 雄辩的$隐藏和$保护属性不起作用,因为它们处理

  • As we learned earlier in the book, the validate method on a Model is called before set and save, and is passed the model attributes updated with the values from these methods. By default, where we def

  • 我在videorequest应用程序中制作简单模型 当我试图运行python manage时,代码cmd中显示了什么错误。py运行服务器查询 由启动的线程中存在未处理的异常。0x0446E7C8处的包装器

  • 英文原文:http://emberjs.com/guides/object-model/computed-properties/ 什么是计算属性? 简单地来说,计算属性就是将函数声明为属性。通过定义一个如同函数一般的计算属性,Ember将会自动调用该函数来获取计算属性的值,此后就可以如同使用普通静态属性一样来使用计算属性。 在需要使用一个或者多个属性的变形,或者手动修改其数据的时候非常有用。 计算