当前位置: 首页 > 知识库问答 >
问题:

Spring Boot-在控制器方法中访问JPA实体属性

彭鹭洋
2023-03-14

我在Spring Boot控制器中访问实例JPA实体的数据时遇到困难。

这些是实体:

用户:

@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Column(unique=true, length=50)
    private String username;

    @OneToMany(cascade = CascadeType.ALL)
    private List<Authority> authorities = new ArrayList<>();
}

权威:

@Entity
@Data
public class Authority {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private String authority;
}

用户存储库:

public interface UserRepository extends CrudRepository<User, Long> {
    Optional<User> findByUsername(String username);
}

这是控制器方法:

@RestController
public class InfoController {
    @RequestMapping(value="/userinfo", method= RequestMethod.GET)
    public Optional<User> getUser() {
        Optional<User> foundUser = repository.findByUsername("testuser");

        return foundUser;
    }
}

当我访问 /userinfo在我的浏览器我得到这个:

{
    "id": 1,
    "username": "testuser",
    "password": "",
    "enabled": true,
    "authorities": [
        {
            "id": 1,
            "authority": "ADMIN"
        }
    ]
}

这很好,到目前为止看起来不错,但我想做的是迭代控制器中用户对象的authorities属性,但我似乎无法访问它(或任何其他属性)。我尝试过使用以下方法:

foundUser.getAuthorities();

foundUser.authorities;

foundUser.get('authorities');

......但是这些方法都不存在。我该怎么做?

共有2个答案

翁和颂
2023-03-14
匿名用户

您正在可选对象上调用方法,而不是实际的User对象。

您可以通过调用User actualUser=foundUser来检索用户对象。get()。

注意,的调用是可选的。get()如果没有值,则抛出NoTouchElementException。

巫研
2023-03-14

请注意,finUser可选的

为了访问其属性,您必须从“可选”中获取用户:

if (foundUser.isPresent()) {
    User user = foundUser.get();
    List<Authority> authorities = user.getAuthorities();
    // Do what you need to do with the list of authorities
}

您还可以使用函数式编程风格的工作,方法是使用类可选上可用的方法,例如map。例如,如果您想在找到可选时仅获取用户的名称,您可以这样做:

// Transforms the Optional<User> to an Optional<String> containing the username
Optional<String> username = foundUser.map(User::getUsername);

或者是一个可选的权限列表:

Optional<List<Authority>> authorities = foundUser.map(User::getAuthorities);

可选表示一个包含值或不包含值的对象。当找到用户时,您的存储库将返回一个可选,其中包含一个User对象,如果未找到用户,则返回一个空的可选

 类似资料:
  • 问题内容: 为什么无法从另一个内部访问其他控制器方法呢? 像这样。 已编译 如果您不能这样做,那为什么不呢?我还应该怎么做… 问题答案: 最近几个小时遇到相同的问题。我使用了api / services文件夹。它可能不完全是您所需要的,但是它是一个选择。

  • 我有两个控制器和。 在中,我有一个名为的方法。 如何在中访问此方法?

  • 之前也有讲到过,Python 没有真正意义上的私有属性。然后这就导致了对 Python 类的封装性比较差。我们有时候会希望 Python 能够定义私有属性,然后提供公共可访问的 get 方法和 set 方法。Python 其实可以通过魔术方法来实现封装。 方法 说明 __getattr__(self, name) 该方法定义了你试图访问一个不存在的属性时的行为。因此,重载该方法可以实现捕获错误拼写

  • 在我的控制器中,我有一个用以下映射映射的方法:@PostMapping(“/”)。 此方法需要一个我试图捕获的请求主体,如下所述: 使用这两种方法对我来说都很好,我只是进退两难,如果直接在实体类中接受请求体是一个好主意和最佳实践的话。 我不想在controller类中公开我的实体类,因为我不确定这是否是一个好主意。 java 这两种方法都给出了相同的结果,更多的是关注要遵循的最佳实践。

  • 容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables 防火墙来进行管理和实现。iptables 是 Linux 上默认的防火墙软件,在大部分发行版中都自带。 容器访问外部网络 容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。 $sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 1 如果为 0,

  • 我尝试使用下面的代码访问元模型实体属性/变量: