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

在JAX-RS中,将列表作为响应返回的最可移植(或标准)方式是什么?

米承嗣
2023-03-14

嗯,任何人都可以说这个问题已经被问到并回答了。不要紧,我也找到他们了。

  • JAX-RS:如何在返回响应对象时自动序列化集合?
  • 通过GenericEntity在RESTful响应对象中使用Java-generics模板类型

我对使用列表 响应的方式并不感到困惑,只是对可移植性不太相信。

@XmlRootElement
public class Stock {

    @XmlAttribute
    private Long id;
}
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public List<Stock> readStocks() {
    final List<Stock> list = getStocks();
    return list;
}

据了解,GlassFish和WileFly工作。

<stocks> <!-- automatic plural? -->
  <stock xmlns="http://...">
  </stock>\
  <stock xmlns="http://...">
  </stock>
</stocks>

<collection> <!-- fixed? -->
  <stock xmlns="http://...">
  </stock>\
  <stock xmlns="http://...">
  </stock>
</collection>

和JSON(我认为它可能因提供者而异)

[
    {
        "id": 1
    },
    {
        "id": 2
    }
]

有时,当容器找不到MessageBodyWriter时,我会发现一个问题。所以我确实喜欢这个。

@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public GenericEntity<List<T>> readStocks() {
    return new GenericEntity<List<Stock>>(getStocks()) {};
}
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response readStocks() {
    return Response.ok(new GenericEntity<List<Stock>>(getStocks()) {}).build();
}
@XmlRootElement
public class Stocks {
    @XmlElement
    private List<Stock> stock;
}

@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Stocks readStocks() {
    final Stocks entity; ///
    return Response.ok(entity).build();
}

根据4.2.4标准实体提供者(JSR-339),list不在强制预打包MessageBody(ReaderWriter)的列表中。

列表 是否标准化?或者哪种方式最便携?

共有1个答案

东郭自强
2023-03-14

list实际上不是问题。对于iswritable,JSON和XML的MBWs通常总是返回true。这就是他们如何能够处理你抛出的所有类型。这与类型擦除有关。genericentity的目的是缓存泛型类型参数,这允许MBW知道要封送为什么类型。

请注意,GenericEntity通常在返回Response时使用。想象一下这个案子

public Response get() {
    List<Somthing> l = service.get();
    return Response.ok(l).build();
}

由于类型擦除,在实体到达类型时,MBW无法知道该类型。对于某个提供者来说,这并不重要。例如,对于Jackson,它通常不需要知道类型,因为它只是内省属性以进行序列化。但是对于Moxy/JAXB,它本质上需要了解类。这就是genericentity发挥作用的地方。

List<String> list = new ArrayList<String>();
GenericEntity<List<String>> entity = new GenericEntity<List<String>>(list) {};
Response response = Response.ok(entity).build();
 类似资料:
  • 问题内容: 目前,为了表示go程序中的换行符,我使用。例如: …将产生一个换行符。 但是,这似乎并不是跨平台的。在其他语言中,PHP用全局常量()表示这一点。是代表在GO / golang一个跨平台的具体方式换行的路吗? 问题答案: 我对此感到很好奇,因此决定看看究竟是做什么的。http://golang.org/src/pkg/fmt/print.go 如果您滚动到最底部,你会看到一个地方,总是

  • 从rest服务抛出的异常以某种方式返回为JSON是否可能?我有一个JAX-RS Rest服务来实现这一点。当我现在抛出它时,它被映射到一个HTML响应,这不是我想要的。据我所知,ExceptionMapper也会将其映射到HTML?是否有其他可供选择的或库允许以JSON格式返回异常?

  • 问题内容: 在T-SQL中,我有一列包含一些文本,其格式如下: 其中可以有任意数量的括号集,但通常在3到6之间。我正在寻找一种将它们快速格式化为临时表或表变量的方法,以便可以报告数据。例如,我希望表格式为: 我知道这正在推动SQL的发展,应该通过修改应用程序来解决,但我希望T-SQL现在可以做些聪明的事情。 问题答案: 如果您具有最大的列数,则在CROSS APPLY中使用一些XML。 如果未知,

  • 我正在使用泽西创建RESTful API资源,并使用生成响应。 RESTful资源的示例代码: 在响应中,它在响应头中返回分块传输编码。在“Jersey world”中,让它返回内容长度标题而不是响应标题中的传输编码:分块标题的正确方式是什么?

  • 问题内容: 我想知道如何对方法返回List的JSON数组,例如: 我想知道如何在我的方法中接收List参数类型 我已经阅读了有关JaxbContext的文章,我了解它如何为我提供帮助。 问题答案: 使用JAXB时,支持两种类型。第一个是元素列表,第二个是元素定界字符串(“常规” XML值或属性,使用某些定界符将其解析为列表)。第一个似乎是您想要的(“数组”)。 有关参考,请参见:http : //

  • 我已经看了很多教程,但我无法使我的简单JAX-RS应用程序工作。Tomcat总是返回错误404。 要获取类的应用程序: 我的JAX-RS文件: web.xml http://localhost:8080/msm-master/resources/hello/ 编辑:已添加Tomcat控制台输出: