胸腺th:每次修复

时间:2018-11-27 19:47:12

标签: java spring thymeleaf

我正在尝试为我的网站使用th:each函数,以查找数据库中的所有狗,并正在使用以下代码。在我的控制器中,我有:

@Controller
public class DogController {

private DogDatabase database = new DogDatabase();
@RequestMapping(value = "/allDogs", method = RequestMethod.GET)
public String getAllDogs(Model model)
{
    ArrayList<Integer> ids = database.getAllIDs();
    System.out.println(ids.size());
    Dog[] dogs = new Dog[ids.size()+1];

    for(int i = 0; i < ids.size(); ++i)
    {
        dogs[i] = database.getDog(ids.get(i));
    }
    model.addAttribute("dogs", dogs);

    return "getAllDogs";
}

在此for循环之后,我对数组中的每个对象执行了println并验证了我所有的dog对象都是有效的,而不是null。验证数组正确后,我将其作为模型传递并尝试在html中获取。当前的问题是,当我转到html时,它什么也不显示。我没有出现任何百里香错误,只是一个黑屏。附件是我的html代码,我将其称为th:each

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>All Dogs</title>
</head>

<body>
    <table>
        <th:block th:each="dog : ${dogs}">
            <tr>
                <td>Name: </td>
                <td th:text="${dog.name}">Name</td>
            </tr>
        </th:block>
    </table>
</body>
</html>

编辑一和二:编辑是为了修复错误,这不在我的代码中

编辑三:我尝试在迭代器中切换狗和狗(如上面的代码所示),但是现在我得到一个错误,即存在一个“异常评估SpringEL表达式:“ dog.name”(模板:“ getAllDogs”) -第13行,第21行)”

但是,这没有任何意义,因为我在整个站点中使用dog.name,并且getName()在Dog类中是公共的。根据要求,我要添加我的狗类:https://pastebin.com/Lknc8dtZ

2 个答案:

答案 0 :(得分:3)

我相信问题就在这里

<th:block th:each="dogs : ${dog}">

因为在您的控制器中,您将Dog []数组绑定到变量“ dogs”:

model.addAttribute("dogs", dogs);

因此,在模板中,您应该像这样进行迭代:

<th:block th:each="dog : ${dogs}">
            <tr>
                <td>Name: </td>
                <td th:text="${dog.name}">Name</td>
            </tr>
</th:block>

在dogs数组中寻找每只狗:)

答案 1 :(得分:1)

这里没有理由使用array中的Dog[]而不是List<Dog> -这可能是导致您出错的原因。您正在创建的array太大,因此它试图在空getName()上调用object

@RequestMapping(value = "/allDogs", method = RequestMethod.GET)
public String getAllDogs(Map<String, Object> model) {
    List<Dog> dogs = database.getAllIDs()
            .stream()
            .map(id -> database.getDog(id))
            .collect(Collectors.toList());
    model.put("dogs", dogs);
    return "getAllDogs";
}

此外,您不需要多余的<th:block />。您可以将th:each直接移动到<tr>上。

<table>
    <tr th:each="dog : ${dogs}">
        <td>Name: </td>
        <td th:text="${dog.name}">Name</td>
    </tr>
</table>