答案和文档显示有一个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;
}
}
在调用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 zzz
和eee MMM d hh:mm:ss yyyy
。
参数转换是用paramconverter
s完成的。如果跟踪stacktrace,您将看到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);
}
};
}
}
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>
你好,我曾与JAX-WS合作开发基于SOAP的网络服务。现在我想使用REST,因为正如我从这里学习的那样,REST比SOAP有优势。 但从不同的文章中,我知道我们也可以从JAX-WS创建RESTful Web服务。但是大多数人说我们应该使用JAX-RS而不是JAX-WS。 我的问题是JAX-WS RESTful webservice和JAX-RS(泽西)之间有什么区别。JAX-RS相对于JAX-W
我对Jackson注释有一个问题,在《大部头1》中似乎被忽略了。我使用Jackson将REST响应序列化为JSON。我打开了设置: openejb。cxf。jax-rs.providers=org。科德豪斯。杰克逊。jaxrs。JacksonJsonProvider在系统中。属性 Jackson序列化工作正常,除了所有似乎被完全忽略的Jackson注释。事件像@JsonIgnore或@JsonPr
泽西-客户端 泽西-普通 jersey-container-servlet jersey-container-servlet-core 泽西-服务器 如果我这样做,我总是得到以下异常: 经过一些研究,我发现我应该添加jersey-servlet-1.12.jar,而不是从上面发布的下载源添加jar。所以我做了。我将其添加到web.xml中
问题内容: 我有一个具有预定义数据结构的对象: 和JSON应该是 我想以肯定的方式处理JSON错误,并且每当服务器为定义的数据类型返回意外的值时,我都希望它被忽略并设置默认值(空)。 现在,当JSON部分无效时,我得到了JSON阅读器异常: 而且我什么都没有。我想要的是获取一个对象: 并分析警告(如果可能)。可以使用JSON.NET完成吗? 问题答案: 为了能够处理反序列化错误,请使用以下代码:
问题内容: 我正在尝试像这样解析日期: 我的价值是5个小时,因为我居住在UTC + 3时区。但是我需要具有2am的值,但是要使用相同的格式字符串(以指定格式给出的日期字符串,我不允许更改)。这该怎么做? 更新:我不需要在适当的时区中格式化日期,我需要通过没有时区的值来比较这些日期。我想确切地解析该日期,而忽略原始字符串中的时区- 且始终包含相同的时区(例如,my),无论包含原始字符串的内容是什么: