使用 JAX-RS 和 Jackson 将 JPA 实体转换为 REST 表示的最佳方法

2024-01-08

我正在寻找一种将一些 JPA 实体导出到 REST API 的方法,但不是每次我想根据入口点共享一些特定字段时都发送整个实体。这是一个小例子:

假设我们有一个Author具有很少字段的类:

@Entity
public class Author implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = SEQUENCE)
    private Long id;

    @NotNull
    @Size(min = 1, message = "{required.field}")
    private String name;

    @NotNull
    @Size(min = 1, message = "{required.field}")
    private String country;

    private LocalDate birthDate;

    // getters and setters
}

假设我们有这个 REST 服务(只有两种方法):

@Path("authors")
public class AuthorREST {

    @Inject
    private AuthorBC bc;

    @GET
    @Produces("application/json")
    public List<Author> find(@QueryParam("q") String query) throws Exception {

        List<Author> result;

        if (Strings.isEmpty(query)) {
            result = bc.findAll();
        } else {
            result =  bc.find(query);
        }
        return result;
    }

    @GET
    @Path("{id}")
    @Produces("application/json")
    public Author load(@PathParam("id") Long id) throws Exception {

        Author result = bc.load(id);

        if (result == null) {
            throw new NotFoundException();
        }

        return result;
    }
}

现在,这样,当我的 API 被调用时,我将始终拥有 4 个字段。

我知道如果我使用杰克逊我可以设置@JsonIgnore到我想忽略的字段,它们将永远被忽略。

但是,如果我希望在某些情况下,我的整个实体由一个服务返回,而在其他服务(或同一服务中的其他方法)中,仅返回 2 或 3 个字段,该怎么办?

有办法做到吗?


@JsonView 和混合

您已经知道可以使用注释,例如@JsonIgnore https://fasterxml.github.io/jackson-annotations/javadoc/2.7/com/fasterxml/jackson/annotation/JsonIgnore.html and @JsonIgnoreProperties https://fasterxml.github.io/jackson-annotations/javadoc/2.7/com/fasterxml/jackson/annotation/JsonIgnoreProperties.html让杰克逊忽略一些属性。

您还可以检查@JsonView https://fasterxml.github.io/jackson-annotations/javadoc/2.7/com/fasterxml/jackson/annotation/JsonView.html注解。有关如何使用的一些详细信息@JsonView https://fasterxml.github.io/jackson-annotations/javadoc/2.7/com/fasterxml/jackson/annotation/JsonView.html使用 JAX-RS,看看here https://github.com/FasterXML/jackson-jaxrs-providers/issues/57.

如果修改 JPA 实体不是一个选项,请考虑混合注释,如此处所述answer https://stackoverflow.com/a/39790836/1426227.

数据传输对象

Data Transfer Object https://en.wikipedia.org/wiki/Data_transfer_object(DTO) 是一种具有明确定义目的的模式:将数据传输到远程接口, 就像网页服务。这种模式非常适合 REST API,并且使用 DTO,您将拥有更多灵活性从长远来看。一旦 REST 资源表示不需要具有与持久性对象相同的属性,您就可以根据需要定制类。

为了避免样板代码,您可以使用映射框架,例如映射结构 http://mapstruct.org/将 REST API DTO 映射到持久性对象。

有关使用 DTO 的好处的详细信息,请查看以下答案:

  • 为什么应该在 REST API 中使用 DTO https://stackoverflow.com/a/36175349/1426227
  • 使用定制的请求和响应类别 https://stackoverflow.com/a/37387553/1426227

要为您的 DTO 提供更好的名称,请检查以下答案:

  • 为您的 DTO 指定有意义的名称 https://stackoverflow.com/a/35341664/1426227
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JAX-RS 和 Jackson 将 JPA 实体转换为 REST 表示的最佳方法 的相关文章

  • 如何在ArrayList中的特定位置插入对象

    假设我有一个大小为 n 的对象的 ArrayList 现在我想在特定位置插入另一个对象 假设在索引位置 k 大于 0 且小于 n 并且我希望索引位置 k 处及其之后的其他对象向前移动一个索引位置 那么有没有什么方法可以直接在Java中做到这
  • JAVA 中的 Composer 相当于什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我目前从 PHP 转向 java 有没有类似的工具composer https getcomposer org 在 PHP 中用于 JAV
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • java 中的梵文 i18n

    我正在尝试使用来自互联网的示例 ttf 文件在 java 中使用 i18n 进行梵文 印地文 我可以加载资源包条目 还可以加载 ttf 并设置字体 但它不会根据需要呈现 jlabel 它显示块代替字符 如果我在 Eclipse 中调试 我可
  • 在 Eclipse 3.5 上安装旧版 TestNG 插件时出现问题

    我正在尝试在 eclipse 3 5 上安装 TestNG 5 11 并获得以下信息 eclipse buildId unknown java version 1 6 0 19 java vendor Sun Microsystems In
  • 验证错误值无效[重复]

    这个问题在这里已经有答案了 我知道这是一个常见的错误 并且有很多关于它的问题 但我必须创建一个新的问题 这是我的 jsf 页面
  • java项目中无法加载类“org.slf4j.impl.StaticLoggerBinder”错误? [复制]

    这个问题在这里已经有答案了 我越来越Failed to load class org slf4j impl StaticLoggerBinder 错误 我想将记录器写入文件 所以我使用了 log4j jar 并使用 apache tomca
  • Spring HATEOAS 和 HAL:更改 _embedded 中的数组名称

    我正在尝试使用 Spring HATEOAS 构建符合 HAL 的 REST API 经过一番摆弄后我终于开始工作了mostly正如预期的那样 示例 输出现在看起来像这样 links self href http localhost 808
  • 对对象集合进行排序[重复]

    这个问题在这里已经有答案了 如果我有一个简单的字符串列表 List
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 从 CLI 部署 Maven 项目?

    在 IDE 中构建并运行良好 cd home thufir NetBeansProjects HelloMaven JAVA HOME usr lib jvm java 8 openjdk amd64 home thufir local s
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • Java 8 方法签名不一致

    Java 8 为我们提供了具有很长签名的新方法 如下所示 static
  • Hibernate 标准接受 %% 值

    我正在使用下面的 Hibernate 代码来过滤workFlowName crt add Restrictions like workFlowName workFlow MatchMode ANYWHERE crt is the crite
  • 为什么不能在 if 语句中声明变量?

    以下 Java 代码无法编译 int a 0 if a 1 int b 0 if a 1 b 1 为什么 不能有任何代码路径导致程序将 1 分配给b无需先声明 我突然想到b的变量范围可能仅限于第一个if声明 但后来我不明白为什么 如果我实在
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset

随机推荐

  • HTML 中的“智能”溢出:有没有办法将省略号“...”放在末尾并带有链接来查看整个内容?

    我有一个 div 大小受限 我想在其中放入多行文本 但如果它会溢出 我想在末尾添加一个 并提供一个链接以在另一页上查看整个内容 这在 Javascript CSS 中可行吗 我尝试搜索一下 但我不确定要寻找什么 嗯 看起来有一个 CSSte
  • 多个 ThreadPoolTask​​Excutors Spring Java 配置

    我的应用程序需要多个任务执行器 但我不知道如何使用 Java Config 来做到这一点 XML 版本很简单 但我肯定缺少 Java 配置的某些内容 我需要两个具有不同队列和线程池大小的不同执行程序 如何使用 Java Config 来完成
  • git:“发送电子邮件”不是 git 命令。请参阅“git --help”

    我正在尝试发送补丁git send email但我收到以下错误 git send email is not a git command See git help 怎么做git send email works 相关链接 http www k
  • 我们可以将mongodb CRUD查询和聚合查询一起编写吗?

    在 MongoDB 中我们可以执行下面的书面查询吗 db dbaname find userName abc aggregate 还有其他方法可以一起执行 CRUD 和聚合查询吗 简短的回答 不 你不能这样做 find userName a
  • Foundation 6 + webpack:无法使 Foundation JS 工作

    我正在努力使用 webpack 安装 foudation js 6 我有一个 意外的令牌导入 我认为这应该与 babel 有关 但我找不到问题出在哪里 我使用基础站点 6 4 1 这是我的 webpack config js var web
  • 如何获取MSI版本?

    我正在尝试使用教程中的这段代码从 MSI 获取版本而不安装它 http www codeproject com Articles 31021 Getting version from MSI without installing it 但是
  • 使用Powershell从sql表中获取值

    我们知道我们可以使用 sql 查询窗口从数据库中获取值 例如 select from 有什么方法可以通过powershell方式获取值 我找到了数据库表本身的方法 但没有找到值的方法 Ex Set location SQLserver sq
  • 使用 Tornado 和 Pika 进行异步队列监控

    我有一个 AMQP 服务器 RabbitMQ http www rabbitmq com 我想同时发布和阅读龙卷风网络服务器 http www tornadoweb org 为此 我想我会使用异步 amqp python 库 尤其Pika
  • java中访问digitalocean水滴信息的简单程序

    我是 DigitalOcean 的新手 我想运行基本的 java 程序来访问 DigitalOcean Droplet 请让我知道一步一步的程序 您可以使用他们的官方 API 获取有关您的 Droplet 的信息 这是一个简单的 REST
  • setonitemclicklistener 不适用于 gridview

    这是我的代码代码 我没有从 gridview setOnClickListener 得到任何响应 请帮帮我 setContentView R layout myfav gView GridView findViewById R id gri
  • 如何在 Windows 8 中显示可变宽度的 Gridview 项目?

    我的 GridView 项目的大小为first item size 我该如何改变这种行为 如何显示GridView items有变量Width根据内容 我想展示第一个 但我正在展示第二个 有什么建议这样做吗 Check Windows 8
  • SWT - 表与 TableViewer

    我正在使用 SWT 创建一个新项目 我的项目中将有 3 或 4 个不同的表 我对 SWT 相当陌生 我发现自己在问我是否应该只使用Table或者它应该是TableViewer 我想学习一些关于何时只使用Table当一个TableViewer
  • 通过 socket.io 1.0 进行现场音频

    来自socket io网站 二进制流 从 1 0 开始 可以来回发送任何 blob 图像 音频 视频 我现在想知道 这是否不能成为我最近想要实现的目标的解决方案 我实际上正在寻找一种方法 如何将实时音频流从 A 即麦克风输入 广播到连接到我
  • 使用 Sphinx 生成 PHP 代码文档? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Sphinx 是一个 Python 库 用于从一组 ReST 格式的文本文件生成漂亮的文档 不是用于全文检索的工具 我也完全了解 do
  • 在 shell 脚本中将一个文件中的 key:value 替换到另一个文件中?

    我有一个包含键值条目的 数据库文件 还有另一个文件 其中键出现在其他内容中 现在我想用我的键值文件的值替换该关键字 例子 有一个文件 keys txt 其中包含 关键字空间 url name1 https maps google com s
  • set 与 unordered_set 的最快迭代

    在我的申请中 我有以下要求 数据结构将仅使用一些值 不是键 值对 填充一次 这些值可能会重复 但我希望数据结构只存储它们一次 我将迭代上面创建的数据结构的所有元素 100 次 元素在迭代中出现的顺序并不重要 约束 1 表明我必须使用 set
  • 将电源计划更改为高性能

    如何将本地计算机上的电源计划更改为高性能 并更改选项 之后关闭显示 我想设置为从不 我找到了远程计算机的所有示例 您可以通过调用来做到这一点activate方法中的Win32 PowerPlan class powerPlan Get Wm
  • 如何获取 Django 视图集中的 API 参数?

    我正在构建一个公开 REST API 的 Django 应用程序 用户可以通过该 API 查询我的应用程序的模型 我正在按照说明进行操作here http www django rest framework org tutorial qui
  • 在 CDI 实现项目中包含空 beans.xml 的目的是什么?

    我在用weld CDI 的 RI 作为我的 JSF EJB JPA Web 应用程序中的依赖项注入组件 我看到在我的项目中我们有空的 beans xmlMETA INF beans xml in ejb jar and WEB INF be
  • 使用 JAX-RS 和 Jackson 将 JPA 实体转换为 REST 表示的最佳方法

    我正在寻找一种将一些 JPA 实体导出到 REST API 的方法 但不是每次我想根据入口点共享一些特定字段时都发送整个实体 这是一个小例子 假设我们有一个Author具有很少字段的类 Entity public class Author