当前位置: 首页 > 知识库问答 >
问题:

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

公英哲
2023-03-14

答案和文档显示有一个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 zzzeee MMM d hh:mm:ss yyyy

共有1个答案

程峻
2023-03-14

参数转换是用paramconverters完成的。如果跟踪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>
    null
 类似资料:
  • 你好,我曾与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),无论包含原始字符串的内容是什么: