我正在学习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.通过注册的
ParamConverter
可使用ParamConverterProvider
的类型。看到有关这些类的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?我无法想象这是一个简单的错误,因为它过于广泛,而且我还没有看到任何抱怨他们的示例无效的评论。
编辑:我确定使用mvn install
时确实可以构建一些更完整的示例,但使用Eclipse时却没有。这使我相信,使用JAX-RS本身可能要做的更少,而使用某些Eclipse设置则需要做更多的事情。但是,我迷住了要看的地方,甚至更加困惑-为什么在不符合JAX-RS规范的情况下构建示例?
我应该更仔细地阅读自己的报价(强调我的意思:
以上每个注释的有效参数类型在对应的Javadoc中列出,但是通常(@ Context除外)支持以下类型:...
检查Javadoc后,我确认@PathParam
确实允许PathSegment
作为类型。该错误本身似乎来自JBoss Eclipse插件的JAX-RS-Validator。插件的最新版本不显示错误。