Thymeleaf-spring boot 的模型属性为空

Posted

技术标签:

【中文标题】Thymeleaf-spring boot 的模型属性为空【英文标题】:Model Attributes null with Thymeleaf-spring boot 【发布时间】:2016-07-12 00:14:55 【问题描述】:

我有一个奇怪的错误让我发疯。 我有一个具有两种不同获取方法的控制器 - 用于两种不同的 url 映射。 URL1 工作得很好,使用 URL2,我得到了

[THYMELEAF][http-nio-8080-exec-3] 异常处理模板 “questionnaireForm”:处理器执行期间出错 'org.thymeleaf.standard.processor.attr.StandardEachAttrProcessor' (问卷形式:10) 引起的 java.lang.NullPointerException: null at org.thymeleaf.context.WebSessionVariablesMap.hashCode(WebSessionVariablesMap.java:276) ~[thymeleaf-2.1.4.RELEASE.jar:2.1.4.RELEASE]

在检查每一行数小时后,很明显我的 Controller Get 方法在调用视图之前向 Model.addAttribute 添加了一个非空对象。 我还从模板中删除了所有代码,并添加了以下内容以进行故障排除:

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

这也返回了同样的空错误! 我在网上唯一能找到的是 Thymeleaf 2.1.4 的一个错误,它是由没有 HttpSession 对象引起的 https://github.com/thymeleaf/thymeleaf/issues/349

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

编辑:添加控制器代码。 /admin/questions 是正常工作的 URL1,'/admin/questionnaires' 是不工作的 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)

所以现在,模板中的对象引用为空。当我将它放入模型时它不为空(我在 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;

【问题讨论】:

对于初学者来说,添加控制器和这两个方法。 什么是URL2 不起作用? 你的意思是你需要在 thymeleaf html 页面中使用@property 文件键和值? URL2 是 /admin/Questionnaires。我正在用更新编辑问题 能否请您发布问题类代码?你确定 Question 有 questionText 属性吗? 【参考方案1】:

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

试试这样的:

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

【讨论】:

我的理解是 Model.addAttribute 也能正常工作?我在其他代码中使用它并且它有效....在这种情况下使用 ModelAndView 有什么特别的理由吗? 你是对的。根据这个thymeleaf.org/doc/articles/springmvcaccessdata.html model.addAttribute 应该可以工作。只是为了测试,试试 ModelAndView 选项,看看它是否有效。【参考方案2】:

“每个”中的输出需要在同一个语句中,我认为这对你有用

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

【讨论】:

以上是关于Thymeleaf-spring boot 的模型属性为空的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf-Spring4 无法自动装配 TemplateEngine

spring整合thymeleaf

Thymeleaf模板引擎+Spring整合使用方式的介绍

U-Boot番外篇 | U-Boot驱动模型DM介绍

Spring boot参数更新模型数据库不起作用

uboot驱动模型(DM)分析