JAX-RS 从傻逼到牛叉 7:注入参数的自动类型转换

前面介绍了各种请求参数的注入,这些参数在 HTTP 请求中都是以纯文本的方式存在的。在处理参数的时候,往往需要把这些文本参数转换为 Java 对象。JAX-RS 提供了一些内置的规则里自动完成这种转换。

转换规则一览

JAX-RS 提供了四条自动类型转换规则,下面我们逐条考察。

原始类型

这个早就见识过了,无需多说。举例回顾一下:

@GET
@Path("{id}")
public Movie getXxx(@PathParam("id") int id) {/*...*/}

提供接受单个 String 参数的构造器的类型

这个也不难理解,JAX-RS 会自动调用该构造器创建一个对象:

public class Style {
    public Style(String name) {/* ... */}
    // ...
}

@GET
@Path("{name}")
public Movie getXxx(@PathParam("name") Style style) {
    // JAX-RS 已自动调用 xxx = new Style(name)
    // ...
}

提供静态工厂方法 valueOf(String) 的类型

也好理解。特别需要注意的是,所有的枚举类型都在此列,因为编译器会自动给枚举类型加上一个这样的工厂方法。例如:

public enum Style {/*...*/}

@GET
@Path("{name}")
public Movie getXxx(@PathParam("name") Style style) {
    // JAX-RS 已自动调用 style = Style.valueOf(name)
    // ...
}

类型参数满足前两个条件的 List<T>、Set<T> 和 SortedSet<T>

这条规则适用于多值参数,例如查询参数:

@GET
@Path("xxx")
public Movie getXxx(@QueryParam("style") Set<Style> styles) {
    // JAX-RS 已自动转换每个 Style 对象并组装到 Set 中
    // ...
}

转换失败的处理

如果转换失败,JAX-RS 会根据情况自动抛出一个包装了初始异常,但是带不同 HTTP 错误码的 WebApplicationException:对矩阵参数(@MatrixParam)、查询参数 (@QueryParam)或路径参数(@PathParam)来说为 HTTP 404 找不到,而对头部参数(@HeaderParam)或 Cookie 参数(@CookieParam)为 HTTP 400 错误请求。

你可能感兴趣的:(JAX-RS 从傻逼到牛叉 7:注入参数的自动类型转换)