我发现的所有其他类似问题都与MultiPart数据和文件上传有关
有关系
该错误是当Jersey无法验证资源模型时遇到的一般错误。资源模型的一部分是方法参数。泽西岛有一个系统可以知道它将处理哪些参数,而不会处理哪些参数。在您的情况下,它不知道如何处理
OffsetDateTime。
为了能够将非基本类型用作
@QueryParams(以及所有其他
@XxxParams诸如
@PathParamand
@FormParam等),需要遵循一组规则:
- 是原始类型
- 有一个接受单个
String
参数的构造函数 - 有一个名为
valueOf
或的静态方法fromString
,该方法接受单个String参数(例如,参见Integer.valueOf(String)
) - 已注册了
ParamConverterProvider
JAX-RS扩展SPI的实现,该实现返回一个ParamConverter
能够对该类型进行“从字符串”转换的实例。 - 是
List<T>
,Set<T>
或者SortedSet<T>
,其中,T
满足2,3或4个以上。结果集合是只读的。
因此,在这种情况下
OffsetDateTime,就在列表中;这不是原始的;它没有String构造函数;它没有静态
valueOf或
fromString
因此,基本上,剩下的唯一选择就是为其实现a
ParamConverter/ParamConverterProvider。基本设置看起来像
@Providerpublic class OffsetDateTimeProvider implements ParamConverterProvider { @Override public <T> ParamConverter<T> getConverter(Class<T> clazz, Type type, Annotation[] annotations) { if (clazz.getName().equals(OffsetDateTime.class.getName())) { return new ParamConverter<T>() { @SuppressWarnings("unchecked") @Override public T fromString(String value) { OffsetDateTime time = ... return (T) time; } @Override public String toString(T time) { return ...; } }; } return null; }}
Jersey将为您传递查询参数的String值,创建并返回它是您的工作。
然后只需
OffsetDateTimeProvider在应用程序中注册。如果您使用的是包裹扫描,则应从
@Provider注释中提取并自动注册它。
我不使用Swagger,所以我不知道他们是否已经提供了已经实现的功能,但是奇怪的是他们会为您生成此功能,而没有办法使其工作。我知道Jersey
3将提供Java 8支持,但是谁知道什么时候发布。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)