Spring Data Rest @EmbeddedId 无法从 Post Request 构造

2023-12-07

我有一个 JPA 实体Person和一个实体Team。两者都由一个实体连接人与团队。该连接实体与以下对象保持多对一关系Person和一到Team。它有一个由 id 组成的多列键PersonTeam,由 @EmbeddedId 表示。为了将嵌入的 id 来回转换为请求 id,我有一个转换器。这一切都遵循以下建议Spring Data REST @Idclass 无法识别

代码如下所示:

@Entity
public class PersonToTeam {
    @EmbeddedId
    @Getter
    @Setter
    private PersonToTeamId id = new PersonToTeamId();

    @ManyToOne
    @Getter
    @Setter
    @JoinColumn(name = "person_id", insertable=false, updatable=false)
    private Person person;

    @ManyToOne
    @Getter
    @Setter
    @JoinColumn(name = "team_id", insertable=false, updatable=false)
    private Team team;

    @Getter
    @Setter
    @Enumerated(EnumType.STRING)
    private RoleInTeam role;

    public enum RoleInTeam {
        ADMIN, MEMBER
    }
}

    @EqualsAndHashCode
    @Embeddable
    public class PersonToTeamId implements Serializable {
        private static final long serialVersionUID = -8450195271351341722L;
        @Getter
        @Setter
        @Column(name = "person_id")
        private String personId;

        @Getter
        @Setter
        @Column(name = "team_id")
        private String teamId;
    }

@Component
public class PersonToTeamIdConverter implements BackendIdConverter {

    @Override
    public boolean supports(Class<?> delimiter) {
        return delimiter.equals(PersonToTeam.class);
    }

    @Override
    public Serializable fromRequestId(String id, Class<?> entityType) {
        if (id != null) {
            PersonToTeamId ptid = new PersonToTeamId();
            String[] idParts = id.split("-");
            ptid.setPersonId(idParts[0]);
            ptid.setTeamId(idParts[1]);
            return ptid;
        }
        return BackendIdConverter.DefaultIdConverter.INSTANCE.fromRequestId(id, entityType);
    }

    @Override
    public String toRequestId(Serializable id, Class<?> entityType) {
        if (id instanceof PersonToTeamId) {
            PersonToTeamId ptid = (PersonToTeamId) id;
            return String.format("%s-%s", ptid.getPersonId(), ptid.getTeamId());
        }
        return BackendIdConverter.DefaultIdConverter.INSTANCE.toRequestId(id, entityType);
    }
}

此转换器的问题是,当 post 请求尝试创建新的 personToTeam 关​​联时,fromRequestId 方法获取 null 作为 id 参数。但没有关于帖子有效负载的其他信息。那么应该如何创建一个带有个人和团队外键的 id 呢?作为一个更普遍的问题:在 Spring Data Rest 中处理多对多关联的正确方法是什么?


遇到同样的问题后,我找到了解决方案。你的代码应该没问题,除非我返回new PersonToTeamId()而不是DefaultIdConverter if id is null in fromRequestId().

假设您在发布请求中使用 JSON,则必须换行personId and teamId in an id object:

{
  "id": {
    "personId": "foo",
    "teamId": "bar"
  },
  ...
}

并且在某些情况下@EmbeddedId不是简单的数据类型,而是外键:

{
  "id": {
    "stringId": "foo",
    "foreignKeyId": "http://localhost:8080/path/to/other/resource/1"
  },
  ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data Rest @EmbeddedId 无法从 Post Request 构造 的相关文章

随机推荐

  • 将 bootstrap 列包装在额外的 div 中

    我正在使用 bootstrap v4 当我将列包装在额外的 div 中时 布局会被破坏 这是为什么 链接到代码笔http codepen io mariuszdaniel pen aJJjzJ Works div class contain
  • JavaScript 键码是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 JavaScript 有哪些可用的键码 如果所有浏览器的键码不相同 请列出每个浏览器的键码 键码是不同的从 ASCII 值 有关完整的 keyCod
  • 将 2d 向量初始化为类变量 C++

    我正在构建一个类 其中一个变量是二维向量 如何设置才能获得初始大小 我尝试了以下方法 但出现错误 在数字常量之前应有 或 另外 当我尝试将值设置为 pncode 的每一行时 我都会收到错误 数组下标的类型 int 无效 这是课程 ifnde
  • InvokeDynamic 参数的动态类型

    为了支持动态类型和方法分派 我的编程语言引入了一种称为dynamic 当调用类型为的被调用者的方法时dynamic 编译器首先将被调用者和所有参数压入堆栈 然后生成一个invokedynamic指令而不是正常的invoke 操作说明 该指令
  • Chrome 扩展程序:sendMessage 不起作用

    我已经读过几次 Google 关于 消息传递 的文档 并且可能查看了 10 多个具有相同问题的其他问题 并且已经尝试了他们的大多数 解决方案 和我下面的内容的一些变体 这就是黑魔法吧 不管怎样 就这样吧 清单文件 manifest vers
  • 未使用 MSBuild、Teamcity 复制 Bin 文件夹

    我有一个非常奇怪的问题 我创建了一个自定义 MSBuild 任务 它将 MVC 项目所需的所有文件移动到特定位置 以便我们可以发布它 当我在我的计算机上本地触发脚本时 这工作正常 但一旦我检查此更改并且 Teamcity 运行脚本 它就会复
  • MySQL 从表 WHERE 条件多行中选择一个字段

    试图找到答案 但还是找不到 表格如下 id keyword value 1 display 15 6 1 harddrive 320 1 ram 3 所以我需要的是这样的 从这个表中选择一个 id keyword display and v
  • C# 对象数组,非常大,寻找更好的方法

    好的 所以在我的一个项目中 我试图重新设计它存储某些变量的方式 我有一个简单的对象数组 这些对象引用的类是 class Blocks public byte type Block Empty byte lastblock Block Zer
  • Wix:通过在立即操作中设置属性来访问延迟操作中的属性:字典中不存在给定的键

    我正在关注几个来源 SO 帖子 甚至是 Wix 安装程序书 这就是我目前在立即自定义操作中设置两个属性 然后尝试在延迟操作中读取它的方式 但是 它不起作用 失败并回滚 并且我不断收到System Collections Generic Ke
  • 在 Mac OS X 上以编程方式为 Matplotlib 选择正确的后端

    我有一个程序集成了 tkinter GUI 和 matplotlib 图 使用 pyplot 为了让这个程序在各种 Mac 平台上正常工作 我遇到了无尽的麻烦 主要问题似乎是后端的适当选择 在某些情况下 程序运行良好没有问题 在其他情况下
  • 为低于 31 的 API 创建 LocationRequest

    我有compileSdkVersion 32 现在我可以创建LocationRequest仅使用LocationRequest Builder LocationRequest create 目前不可用 这意味着我什至无法调用这个已弃用的静态
  • 将指数分布叠加到直方图上

    如何在时间间隔直方图上叠加指数分布 直方图看起来像指数分布 当我尝试以与叠加法线曲线类似的方式创建直方图时 我得到以下结果 Error in xy coords x y x and y lengths differ 我可以自己创建直方图 它
  • 用于 Caffe 的 Python 还是 Matlab?

    我将致力于在 Caffe 中实现 DQN 和 Google DeepMind 的最新扩展 为此 我将编写一个模拟器 代替 Atari 模拟器 来为代理创建培训体验 我的问题是 Matlab 或 Python 的 Caffe 接口中哪一个最成
  • 有没有办法通过sql获取Windows任务管理器详细信息?

    我无法访问客户端的 Windows 远程计算机 我仅通过 tsql 连接他们的数据库服务器 我需要检查哪些进程占用了更多内存并通知他们 有没有tsql查询来获取windows进程 对的 这是可能的 您可以致电TASKLIST命令通过xp c
  • 错误:未定义对“cv::imread(std::string const&, int)”的引用

    我是 Qt 新手 我有一个需要在 Qt 中配置 OpenCV 的项目 我尝试在 Qt 中运行一个简单的代码 但出现此错误 未定义的引用 cv imread std string const int 这是我的代码 include opencv
  • 当键为数字时,如何从多维数组中回显单个值?

    以此数组为例 Array events gt Array 0 gt Array event gt Array category gt seminars sales status gt Live 如何检索类别的值 我尝试过各种组合 例如 ec
  • PHP 将重复行插入数据库

    我使用以下代码将用户插入到名为 accounts 的表中 session start include include connect php Posted information from the form put into variabl
  • jQuery 事件:检测 div 的 html/文本的更改

    我有一个 div 它的内容一直在变化 是吗 ajax requests jquery functions blur等等等等 有没有办法可以随时检测到 div 上的任何变化 我不想使用任何间隔或检查的默认值 像这样的事情会做 mydiv co
  • 如何测试 dockerignore 文件?

    读完后 dockerignore文档 我想知道有没有办法测试一下 Examples node modules 如何检查我的 dockerfile 忽略正确的文件和目录 扩展至VonC的建议 这是一个示例构建命令 您可以使用它来使用当前文件夹
  • Spring Data Rest @EmbeddedId 无法从 Post Request 构造

    我有一个 JPA 实体Person和一个实体Team 两者都由一个实体连接人与团队 该连接实体与以下对象保持多对一关系Person和一到Team 它有一个由 id 组成的多列键Person和Team 由 EmbeddedId 表示 为了将嵌