gpt4 book ai didi

java - JAX-RS 服务中用于日期解析的@JsonFormat 被忽略

转载 作者:搜寻专家 更新时间:2023-10-31 20:18:22 24 4
gpt4 key购买 nike

我正在尝试将日期传递给 JAX-RS 服务。检查其他问题,例如:Date format Mapping to JSON Jackson

答案和文档显示有一个 jackson annotation这应该允许日期格式。

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;
}
}

在调用 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)

似乎注释被忽略了。调试解析方法,模式设置为 EEE, dd MMM yyyy HH:mm:ss zzzEEE MMM d HH:mm:ss yyyy

我正在使用绑定(bind) jackson 2.5.4 的 Spring 4.2.1、Jersey 2.22。

如何使用正确的模式解析日期?

更新:进一步思考 JSON 仅用于输出解析。但这可能与 JAX-RS 参数解析有关。

最佳答案

Param 转换是用 ParamConverter 完成的秒。如果您遵循堆栈跟踪,您将看到 ParamConverters$DateProvider .下一个电话是 HttpDateFormat进行解析的类。

如果您查看类的顶部,您将看到支持的日期格式。这些是标准的 HTTP 数据格式

/**
* The date format pattern for RFC 1123.
*/
private static final String RFC1123_DATE_FORMAT_PATTERN = "EEE, dd MMM yyyy HH:mm:ss zzz";
/**
* The date format pattern for RFC 1036.
*/
private static final String RFC1036_DATE_FORMAT_PATTERN = "EEEE, dd-MMM-yy HH:mm:ss zzz";
/**
* The date format pattern for ANSI C asctime().
*/
private static final String ANSI_C_ASCTIME_DATE_FORMAT_PATTERN = "EEE MMM d HH:mm:ss yyyy";

据我所知或所知,没有可用的配置可以添加到此列表中。唯一的其他选择是编写自己的转换器。例如

@Provider
public class DateParamConverterProvider implements ParamConverterProvider {

private final String format;

public DateParamConverterProvider(String dateFormat) {
this.format = dateFormat;
}

@Override
public <T> ParamConverter<T> getConverter(Class<T> rawType,
Type genericType,
Annotation[] annotations) {

if (rawType != Date.class) { return null; }

return (ParamConverter<T>) new ParamConverter<Date>() {

@Override
public Date fromString(String value) {
SimpleDateFormat formatter = new SimpleDateFormat(format);
try {
return formatter.parse(value);
} catch (Exception ex) {
throw new WebApplicationException("Bad formatted date", 400);
}
}

@Override
public String toString(Date date) {
return new SimpleDateFormat(format).format(date);
}
};
}
}

这是一个使用 Jersey Test Framework 的完整测试用例

public class DateParamTest extends JerseyTest {

private static final String FORMAT = "MM-dd-yyyy";

@Path("date")
public static class DateResource {
@GET
public String get(@MatrixParam("since") Date date) {
return new SimpleDateFormat(FORMAT).format(date);
}
}

@Override
public ResourceConfig configure() {
return new ResourceConfig(DateResource.class)
.register(new DateParamConverterProvider(FORMAT));
}

@Test
public void should_return_same_date_and_format() {
final String date = "09-30-2015";
Response response = target("date").matrixParam("since", date)
.request().get();
assertEquals(200, response.getStatus());
String returnDate = response.readEntity(String.class);
assertEquals(date, returnDate);
System.out.println(returnDate);
}
}

这里是测试框架的依赖

<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>${jersey2.version}</version>
<scope>test</scope>
</dependency>

另请参阅:

关于java - JAX-RS 服务中用于日期解析的@JsonFormat 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com