Spring Boot 使用Sping Boot 和Thymeleaf,我如何获取网页上显示的变量的值,而不是变量的内存地址?

z31licg0  于 2023-06-22  发布在  Spring
关注(0)|答案(1)|浏览(109)

我正在尝试显示已注册网站用户及其用户角色的列表。用户数据存储在一个表中,并与索引用户及其角色(例如ROLE_DEFAULT_USER、ROLE_DEVELOPER、ROLE_ADMIN)
但在角色列中,我得到了一个看起来像内存地址的东西。

当每个用户的角色列表添加到其UserDto时,我可以看到角色的名称。

我在用
xmlns:th=”http://www.thymeleaf.org“
显示表行的HTML代码是

<tr th:each="user : ${users}">
            <td><span th:text="${user?.name}"> name </span></td>
            <td><span th:text="${user?.email}"> email </span></td>
            <td><span th:text="${user?.businessName}"> business name </span></td>
            <td><span th:text="${user?.roles}"> role </span></td> 
             <td>Edit</td>
        </tr>

我尝试了<tdth:text="${user.roles.name}">角色</td>
但是这会引发这个错误“Property or field 'name' cannot be found on object of type 'org.hibernate.collection.spi.PersistentBag' - maybe not public or not valid?“
UserDto和User类都具有

private List<Role> roles = new ArrayList<>();
public List<Role> getRoles() {
        return roles;
    }

AuthController中的Map为

@GetMapping("/users")
    public String users(Model model){
        List<UserDto> users = userServiceImpl.findAllUsers();
        model.addAttribute("users", users);
        return "users";
    }

UserServiceImpl具有

@Override
    public List<UserDto> findAllUsers() {
        List<User> users = userRepository.findAll();
        return users.stream()
                .map((user) -> mapToUserDto(user))
                .collect(Collectors.toList());
    }

    private UserDto mapToUserDto(User user) {
        UserDto userDto = new UserDto();

        userDto.setName(user.getName());
        userDto.setOrganization(user.getOrganization());
        userDto.setEmail(user.getEmail());
        userDto.setBusinessName(user.getBusinessName());
        userDto.setPhoneNumber(user.getPhoneNumber());
        userDto.setPostCode(user.getPostCode());
        userDto.setAddress(user.getAddress());
        userDto.setUsagePurpose(user.getUsagePurpose());
        userDto.setRoles(user.getRoles());

        return userDto;
    }
xxslljrj

xxslljrj1#

在类Role中,您应该实现(覆盖)toString()方法并返回name字段。

**背景:**如果toString()方法没有为特定类实现,Java将使用Object类的toString()方法实现,它只返回示例的内部名称:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

这就是你目前在前端看到的。
此外,您可以在UserDto类中实现toString()方法,以获得角色集合的漂亮输出。而不是带有方括号的默认值:[ROLE_DEFAULT_USER,ROLE_DEVELOPER]

相关问题