使用JAX-RS和java.time.LocalDate(java8)的问题.
我想使用JSON将这样的对象传递给JAX-RS方法:
Person {
java.time.LocalDate birthDay;
}
Run Code Online (Sandbox Code Playgroud)
我得到的例外是:
com.fasterxml.jackson.databind.JsonMappingException:找不到类型[simple type,classjava.time.LocalDate]的合适构造函数:无法在[来源:io.undertow.servlet.spec.ServletInputStreamImpl@21cca2c1; 来自JSON对象(需要添加/启用类型信息?)实例化)line:2,column:3]
我怎样才能创建一种将json-dates映射到的拦截器java.time.LocalDate?我试过实现了一个MessageBodyReader,但如果LocalDate是另一个类中的一个字段,我必须MessageBodyReader为每个持有a的类写一个LocalDate(据我所知).
(Java EE7(仅使用javaee-api,不需要任何第三方依赖),JAX-RS,Java 8,Wildfly 8.2)
有什么建议?
我正在使用的API决定接受UUID作为Base32编码的字符串,而不是UUID.fromString()期望的标准十六进制,破折号分隔格式.这意味着我不能简单地写@QueryParam UUID myUuid为方法参数,因为转换会失败.
我正在解决这个问题,通过使用不同的fromString转换器编写自定义对象以与Jersey @QueryString和@FormParam注释一起使用.我希望能够访问fromString方法中的转换上下文,以便我可以提供更好的错误消息.现在,我所能做的就是以下几点:
public static Base32UUID fromString(String uuidString) {
final UUID uuid = UUIDUtils.fromBase32(uuidString, false);
if (null == uuid) {
throw new InvalidParametersException(ImmutableList.of("Invalid uuid: " + uuidString));
}
return new Base32UUID(uuid);
}
Run Code Online (Sandbox Code Playgroud)
我希望能够公开哪个参数具有无效的UUID,因此我记录的异常和返回的用户错误非常清楚.理想情况下,我的转换方法会有一个额外的参数用于细节,如下所示:
public static Base32UUID fromString(
String uuidString,
String parameterName // New parameter?
) {
final UUID uuid = UUIDUtils.fromBase32(uuidString, false);
if (null == uuid) {
throw new InvalidParametersException(ImmutableList.of("Invalid uuid: " + uuidString
+ …Run Code Online (Sandbox Code Playgroud) 我正在尝试将日期传递给JAX-RS服务。检查其他问题,例如:日期格式映射到JSON Jackson
答案和说明文件表明,有一个杰克逊注释应允许日期格式。
public class SolutionFilter {
@MatrixParam("toDate")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd", timezone="CET")
private Date toDate;
public void setToDate(Date toDate) {
this.toDate = toDate;
}
}
Run Code Online (Sandbox Code Playgroud)
致电Rest-Service时,我得到了ParseException:
Caused by: java.text.ParseException: Unparseable date: "2016-01-01"
at java.text.DateFormat.parse(DateFormat.java:366)
at org.glassfish.jersey.message.internal.HttpDateFormat.readDate(HttpDateFormat.java:137)
at org.glassfish.jersey.server.internal.inject.ParamConverters$DateProvider$1.fromString(ParamConverters.java:259)
Run Code Online (Sandbox Code Playgroud)
好像注释被忽略了。调试模式设置为EEE, dd MMM yyyy HH:mm:ss zzz和的解析方法EEE MMM d HH:mm:ss yyyy。
我正在使用Spring 4.2.1,Jersey 2.22,它绑定了jackson 2.5.4。
如何获得使用正确格式分析的日期?
更新:进一步考虑,JSON仅用于输出解析。但这可能与JAX-RS参数解析有关。