【发布时间】: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 中的疏忽。
标签: java eclipse jakarta-ee jax-rs