根据 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();
(有时PathSegment
是List<PathSegment>
,但现在不相关。)
复制示例 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. 具有名为valueOf
或fromString
的静态方法和单个String
参数的类型 返回该类型的实例。如果两种方法都存在,则必须使用valueOf
,除非 类型是枚举,在这种情况下必须使用fromString
。 5.List<T>
、Set<T>
或SortedSet<T>
,其中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?的主要内容,如果未能解决你的问题,请参考以下文章
带有 Resteasy 的 JAX-RS:如何进行“超类”请求标头管理? [复制]
Java:使用带有 Spring Security 的 Jersey Jax-RS 进行用户身份验证