Springs Boot + Thymeleaf; th:对象+字段在复选框"任意"给出错误

时间:2016-02-19 21:35:49

标签: java html spring-boot thymeleaf

经过15个小时的审判和恐怖,我决定与世界分享我的问题,因为坦率地说,我不知道如何解决我的问题了:

我已经为用户创建了一个自定义表单来检查复选框并按下保存按钮: 这是相关代码的片段:

<form th:action="@{/profile}" action="/profile" th:object="${profileModel}" method="POST">
    <div class="row" style="margin-left: 5px;"><h4>Select</h4></div>

        <div class="row">

        <!-- Barbell -->
            <section class="panel panel-default panel-equipment col-md-3">
                <header class="panel-heading panel-heading-profileform">
                    <h3 class="panel-title"><b>Barbell</b></h3>
                </header>
                <div class="col-md-12">
                    <div><input type="checkbox" th:field="*{equipment.barbellLight}" th:value="1">   Light</input></div>
                    <div><input type="checkbox" th:field="*{equipment.barbellMedium}" th:value="1">   Medium</input></div>
                    <div><input type="checkbox" th:field="*{equipment.barbellHeavy}" th:value="1">   Heavy</input></div>
                </div>
            </section>
        </div>
    </div>
</form>

我的控制器: 请求:

@RequestMapping(value = "/profilestage", method=RequestMethod.POST)
public String updateProfileStage(@ModelAttribute ProfileModel profileModel, Model model){

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String username = auth.getName();
    model.addAttribute("signedin", true);
    model.addAttribute("username", username.substring(0, 1).toUpperCase() + username.substring(1));

    UserEntity user = userService.findByUsername(username);
    ProfileEntity profile = user.getProfile();

    model.addAttribute("profileModel", ModelEntityConvertor.profileEntityToModel(profile));

    return "profile_new";
}

这不是所有的控制器,但就您需要知道的而言,我已经彻底调试了所有这些代码并且profileModel进入,th:object中使用的那个,永远不会为null,并且始终设置所有必填字段(在我的情况下全部为0&#39;)。

表单正在发布到此控制器:

@RequestMapping(value = "/profile", method=RequestMethod.POST)
public String updateProfile(@ModelAttribute ProfileModel profileModel, Model model){

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String username = auth.getName();
    UserEntity user = userService.findByUsername(username);
    ProfileEntity profile = user.getProfile();
    profile.setEquipment(ModelEntityConvertor.equipmentModelToEntity(profileModel.getEquipment(), profile.getEquipment()));

    profileService.updateProfile(profile);

    return this.getProfile(model);
}

每当我的应用程序决定不工作时,永远不会到达此控制器,但无论何时到达,它都像魅力一样工作,并且完全按照预期工作。

我试图解决的一个大问题是,所有这些偶尔都有效。一分钟我运行代码,没问题。然后我重新运行完全相同的代码,尝试与其他用户或两者一起执行此操作,并在单击save弹出的默认错误页面后显示。 在任何地方都没有提供错误消息......

我试过了:

  • 清理项目
  • 关闭日食
  • 完全重建项目
  • 在chrome的开发者模式下工作(我总是这样做,css中的任何更改都会一直显示)
  • 将spring.template.cache:false和spring.thymeleaf.cache:false添加到属性

老实说,我不明白我做错了什么,真的很感谢你的帮助=)

Thnx提前阅读我的文本墙并为后者道歉。 如果我的代码需要更多,我在这里不停。

1 个答案:

答案 0 :(得分:2)

1)将第一个控制器块中的method=RequestMethod.POST更改为method=RequestMethod.GET

Further background on GET vs POST(OP不需要,但未来读者需要)

2)在记录器中将此设置为DEBUG:org.springframework.weborg.spring.web.context也可以进一步了解哪些页面被调用。

3)在方法签名中添加BindingResult,将基元默认为零。 (参见评论中OP的注释。)