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

在RESTful JAX-RS Apache CXF中实现超媒体

曾弘扬
2023-03-14
@GET
@Path("/{exampleId}")
public ExampleJSON get(@PathParam("exampleId") Integer exampleId) {
    ExampleJSON example;
    // Load data from repository here...

    // Add link to self.
    String href = javax.ws.rs.core.Link.fromResource(ExampleService.class).build().getUri().toString();

    // HypermediaLink is a custom object to hold a "href" and "rel" strings
    HypermediaLink linkToSelf = new HypermediaLink();
    linkToSelf.setHref(href + example.getId());
    linkToSelf.setRel("self");

    // Inherited method, just adds a HypermediaLink to a collection in the parent class
    example.addHypermediaLink(linkToSelf);

    // Return JSON compatible object, JACKSON will serialize it nicely.
    return example;
}

共有1个答案

东典
2023-03-14

我将利用JAX-RS和/或Jackson的一些特性来实现序列化级别的链接添加。因此,您不需要在bean本身中为链接设置特定的字段。

>

  • 您可以实现自定义的MessageBodyWriter来为POJO生成不同于默认的JSON有效负载(例如)。因此可以动态添加链接。

    有关更多细节,请参见以下答案:如何使用Jersey编写XML MessageBodyWriter提供程序。

    public class LinkBeanSerializer extends JsonSerializer<SomeBean> {
        @Override
        public void serialize(SomeBean bean, JsonGenerator jgen,
                SerializerProvider provider) throws IOException,
                      JsonProcessingException {
            jgen.writeStartObject();
    
            // Fields
            jgen.writeNumberField("id", bean.getId());
            // Things could be generic using reflection
    
            // Link
            String href = javax.ws.rs.core.Link.fromResource(SomeBean.class).build().getUri().toString();
            HypermediaLink linkToSelf = new HypermediaLink();
            linkToSelf.setHref(href + bean.getId());
            linkToSelf.setRel("self");
            jgen.writeObjectField("hypermediaLink", linkToSelf);
    
            jgen.writeEndObject();
        }
    }
    

    有关更多细节,请参见以下答案:泽西更新实体属性MessageBodyWriter。

    IMO更方便的解决方案是第二种。它是透明的,支持杰克逊支持的所有格式。

    希望对你有帮助,蒂埃里

  •  类似资料:
    • 我现在正在读《实践中的Rest》一书。我无法理解以下术语超媒体,超媒体格式,超媒体控件,域应用协议。作者建议需要特定领域的超媒体格式。我很难理解这些。我在谷歌上搜索了这些术语,但没有找到正确的答案。谁能解释一下这些术语,以及为什么我们需要特定于领域的超媒体格式而不是应用程序/XML?

    • 本文向大家介绍Bootstrap媒体对象的实现,包括了Bootstrap媒体对象的实现的使用技巧和注意事项,需要的朋友参考一下 在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件,在bootstrap框架中其对应的版本文件如下: LESS: media.less SASS: _media.scss 媒体对象一般是成组出现,一组

    • 在实施Drm Dash媒体源时,出现以下异常。MediaCodeCrederer$DecodeInitializationException:解码器初始化失败:OMX。埃克西诺斯。avc。十二月安全 下面列出了错误报告 ExoPlayerInimplified:渲染器错误:index=0,type=video,格式=Formate(p0va0br256000, null, null, video/

    • 本文向大家介绍Android实现多媒体录音笔,包括了Android实现多媒体录音笔的使用技巧和注意事项,需要的朋友参考一下 记事本涉及到的仅仅是对string 的存储,而且在读取上并不存在什么难点,直接用textview显示便可以了。需要做的主要是使用SQLite对数据进行一个整理。 而录音笔需要考虑的就相对较多了:比如录音时中断,录音时用户点击播放按钮;未录音,用户点击停止按钮;在录音或者播放时

    • 问题内容: 有没有一种方法可以在Python中实现用于多线程目的的锁定,其方法可以具有任意超时?到目前为止,我发现的唯一可行的解​​决方案是使用轮询, 我发现优雅和低效 不保留锁的有界等待/进度保证作为关键部分问题的解决方案 有没有更好的方法来实现这一目标? 问题答案: 详细阐述史蒂文的评论建议: 注意事项: 有两个对象,一个在内部。 操作时,获取了锁;但是,该操作将其解锁,因此任何数量的线程都可