【问题标题】:Passing custom type query parameter传递自定义类型查询参数
【发布时间】:2016-09-12 16:05:50
【问题描述】:

如何接受自定义类型查询参数?

public String detail(@QueryParam("request") final MYRequest request) {

上面一行在启动服务器时出错

jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.

【问题讨论】:

    标签: java rest jersey jax-rs dropwizard


    【解决方案1】:

    查看@QueryParam 文档,了解可接受的注入类型。 (这同样适用于所有其他 @XxxParam 注释)

    1. 成为原始类型
    2. 有一个接受单个字符串参数的构造函数
    3. 有一个名为 valueOffromString 的静态方法,它接受单个字符串参数(例如,请参阅 Integer.valueOf(String)
    4. 有一个ParamConverterProvider JAX-RS 扩展 SPI 的注册实现,它返回一个能够对类型进行“来自字符串”转换的 ParamConverter 实例。
    5. List<T>Set<T>SortedSet<T>,其中T 满足上述2、3 或4。生成的集合是只读的。

    这些要求的原因是值以字符串形式出现。运行时需要知道如何将字符串转换为要注入的类型。异常的原因是在启动时进行了初始资源模型验证。此验证检查以确保您的所有注入点都有效。它看到注入的类型MyRequest不满足上述任何要求,并抛出异常。

    基本上你有第 2 点和第 3 点,你需要自己解析字符串,例如

    public class MyRequest {
        public static MyRequest fromString(string param) {
            // 1. Parse string
            // 2. Create MyRequest request;
            return request;
        }
    }
    

    你可以看到一个使用ParamConverterhere的好例子

    【讨论】:

    • 如果我有一个包含许多成员字段的自定义类,它的构造函数接受一个只是空构造函数的单个字符串,会发生什么?它还会传递这个类的对象及其状态吗?
    • @YonatanNir 您需要自己从该字符串构建类。即使这意味着您需要手动解析字符串。如果您有类似 JSON 结构的字符串,请查看这篇文章中的最后一个链接。它显示了第三个选项。
    • 我知道我需要用字符串构造类,这是具有字符串构造函数的定义。我要问的是,如果我在该自定义类中有其他成员,而我的构造函数只是一个接受 String 参数的虚拟空构造函数,会发生什么情况。其他成员的值会与对象一起传递吗?
    • 通过构造我的意思是你需要自己设置所有的值。如果您使用的是构造函数选项(而不是静态 valueOf),则 Jersey 调用是您传入字符串参数的构造函数。设置任何成员的值是你的工作。
    • @YonatanNir 这样说。查询参数值只不过是一个字符串。 Jersey 不知道如何从该字符串创建自定义类型。但它为您提供了一些您可以遵循的规则,这些规则将允许 Jersey 将字符串传递给您,并且您可以使用它做任何您想做的事情来创建对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多