Thymeleaf表单selectpicker提交后HttpServletRequest getParameterValues返回null咨询
问题根源
你的空指针异常核心原因是Thymeleaf的th:field属性会覆盖你手动定义的name属性,导致前端提交的参数名和后端取值的参数名不匹配:
- 你在超能力多选框上同时定义了
th:field="*{powers}"和name="powerNames",Thymeleaf渲染后实际生成的name属性值为powers,而非你写的powerNames - 同理组织多选框渲染后实际
name属性值为organizations,而非organizationNames - 后端使用
getParameterValues("powerNames")、getParameterValues("organizationNames")取值自然返回null,直接遍历null数组就会触发空指针。
修复方案
二选一即可:
方案1:保留th:field属性,修改后端取值代码
将业务层取值的参数名修改为和th:field生成的参数名一致:
// 原代码 // String[] organizationNames = request.getParameterValues("organizationNames"); // String[] powerNames = request.getParameterValues("powerNames"); // 修改为 String[] organizationNames = request.getParameterValues("organizations"); String[] powerNames = request.getParameterValues("powers");
方案2:删除th:field属性,保留手动定义的name
去掉两个select标签上的th:field属性,这样你手动写的name="powerNames"、name="organizationNames"会生效,后端代码无需修改。
额外优化建议
不管选哪种方案,都建议在遍历数组前增加非空判断,避免用户未选择任何选项时再次触发空指针:
List<Organization> organizations = new ArrayList<>(); if(organizationNames != null) { for(String orgName : organizationNames){ organizations.add(orgDao.getOrganizationByName(orgName)); } } List<Power> powers = new ArrayList<>(); if(powerNames != null) { for(String powerName : powerNames){ powers.add(powerDao.getPowerByName(powerName)); } }
内容的提问来源于stack exchange,提问作者Joe McAdams
相关产品推荐
相关产品推荐

