根据 JAX-RS 中的规范使用带有 @PathParam 的 PathSegment?

Posted

技术标签:

【中文标题】根据 JAX-RS 中的规范使用带有 @PathParam 的 PathSegment?【英文标题】:Using PathSegment with @PathParam against specifications in JAX-RS? 【发布时间】:2020-04-12 23:28:06 【问题描述】:

我正在学习 JAX-RS。在阅读它并阅读有关它的书籍时,我多次阅读以下示例:

import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.PathSegment;

@Path("/read")
@Stateless
@Produces("text/plain")
public class MinimalExample

  @GET
  @Path("/b/file")
  public String readFile2(@PathParam("file") List<PathSegment> fileParam)
  
    return fileParam.toString();
  

(有时PathSegmentList&lt;PathSegment&gt;,但现在不相关。) 复制示例 Eclipse 时抛出错误,告诉我:

“javax.ws.rs.core.PathSegment”类型对此参数无效。有关详细信息,请参阅 JAX-RS 2.0 规范(第 3.2 节)。

我查看了有问题的规范,确实证实了这一点。 PathSegment 是一个既没有valueOf 也没有fromString 的接口。这些示例都没有提供ParamConverterProvider

上述每个注解的有效参数类型都列在相应的 Javadoc 中,但是在 一般(不包括@Context)支持以下类型: 1. 可通过注册的ParamConverterProvider 获得ParamConverter 的类型。看 这些类的 Javadoc 以获取更多信息。 2. 原始类型。 3. 具有接受单个 String 参数的构造函数的类型。 4. 具有名为valueOffromString 的静态方法和单个String 参数的类型 返回该类型的实例。如果两种方法都存在,则必须使用valueOf,除非 类型是枚举,在这种情况下必须使用fromString。 5.List&lt;T&gt;Set&lt;T&gt;SortedSet&lt;T&gt;,其中T满足上述1、3或4。

这与 JavaEE 规范相反,JavaEE 规范也允许 PathSegment as shown here 作为有效类型。 有人可以向我解释一下所有这些 JAX-RS 示例在违反 JAX-RS 规范时是如何使用 PathSegment 的吗?我无法想象这是一个简单的错误,因为它太普遍了,而且我还没有看到任何 cmets 抱怨他们的示例不起作用。

编辑:我已经确定一些更完整的示例在使用mvn install 时确实会构建,但在使用 Eclipse 时不会。这让我相信它可能需要对 JAX-RS 本身做更少的事情,而对我的一些 Eclipse 设置做更多的事情。但是,我不知道在哪里看,甚至更困惑 - 为什么在不符合 JAX-RS 规范的情况下构建示例?

【问题讨论】:

如果您在 Eclipse 中的构建时收到此错误,那只是因为您有一些 Eclipse 插件或附加检查误导了您。 Java 编译器不可能进行这样的检查。 你是对的,错误不是构建停止,似乎是 JBoss 插件的 JAX-RS-Validator 中的疏忽。 【参考方案1】:

我应该更仔细地阅读我自己的报价(强调我的):

上述每个注解的有效参数类型都列在对应的Javadoc中,但是一般(不包括@Context)支持以下类型: ...

检查 Javadoc 后,我确认 @PathParam 确实允许 PathSegment 作为类型。 错误本身似乎来自 JBoss Eclipse 插件的 JAX-RS-Validator。 最新版本的插件不会显示错误。

【讨论】:

以上是关于根据 JAX-RS 中的规范使用带有 @PathParam 的 PathSegment?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MS SQL 的 JAX-RS 中的行级安全性

在JAX-RS中的查询参数中转义`%`符号

带有 Resteasy 的 JAX-RS:如何进行“超类”请求标头管理? [复制]

Java:使用带有 Spring Security 的 Jersey Jax-RS 进行用户身份验证

带有安全过滤器和依赖注入的 jax-rs 1.1,如何实现这一点?

使用 JAX-RS Jersey 2.2 获取带有 Content-Type 和 Accept 标头的请求