我应该在JAX-RS @PathParam中使用Date类型吗?


9

这就是我正在考虑使用Jersey在JEE Glassfish服务器上执行的操作。

@GET
@Path("/{name}/{date}")
public String getMessages(@PathParam("name") String name, @PathParam("date") Date date)

我喜欢能够告诉使用RESTful Web服务的人们“这里的日期是Java中与Date类一起使用的任何东西”的想法。从他们可以仅查看Date规范的角度来看,这非常简单,并且他们已经有了可以测试的工作模型。

我担心的问题是,当执行此操作时,当Date()不喜欢其在构造函​​数中获得的内容时,JAX-RS并不是很好。由于Date()如果无法解析给出的内容,则会引发错误(例如,如果您将字符串“ today”(而不是实际日期)传递给它),那么JEE服务器将返回404错误。

这是一个好习惯吗?有我没有想到的更好的方法吗?

Answers:


8

听起来是个坏主意。一方面,自Java 1.1以来,就不再使用您依赖的Date构造函数,而推荐使用DateFormat.parseDate(),这恰恰是因为不清楚如何将字符串解析为日期,因为不同地区的规则不同。

我的建议是坚持使用特定格式,最好是国际公认的yyyy-MM-dd,并使用DateFormat从服务内部的字符串中解析日期,这样可以清楚地了解如何使用Web服务,并允许您当出现问题时,遵循Web服务返回错误消息的标准约定。


11

我正在使用自定义类DateParam

@GET
@Path("/{name}/{date}")
public String getMessages(@PathParam("name") String name, @PathParam("date") DateParam date)
  Date date = date.getDate();

该类定义为:

public class DateParam {
  private final Date date;

  public DateParam(String dateStr) throws WebApplicationException {
    if (isEmpty(dateStr)) {
      this.date = null;
      return;
    }
    final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    try {
      this.date = dateFormat.parse(dateStr);
    } catch (ParseException e) {
      throw new WebApplicationException(Response.status(Status.BAD_REQUEST)
        .entity("Couldn't parse date string: " + e.getMessage())
        .build());
    }
  }

  public Date getDate() {
    return date;
  }
}

如果参数为空,那么您将获得一个空日期。您可以DateParam通过公共静态final字段扩展未定义的日期值。这样可以使对未定义日期参数的测试更加清晰。

这里的一个缺点是,对于每个DateParam,都会创建一个SimpleDateFormat的新实例。但是,由于SimpleDateFormat不是线程安全的,因此我们无法轻松地重用它。


3
1+。Java 8引入了线程安全DateTimeFormatter。对于Java <= 7,我将使用ThreadLocal
Anthony Accioly 2014年

3

谁将使用您的服务?他们会麻烦查找Date类的规范并弄清楚它将解析哪种字符串吗?即使我是Java程序员,我也不会知道该去哪里;-)

我认为您应该首先告诉您的用户您的URI的外观,例如

.../your-resource-name/yyyy-MM-dd

然后寻找一种方法让Jersey帮助您解析所选的日期格式。这可能意味着使用Date参数类型,并可能在@Path注释中指定正则表达式,例如

@Path(/{name}/{date: [0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]/)

或使用其他一些能够解析您格式的日期的类。如何处理与您提供给用户的规范不匹配的URI是另一件事,您应该决定如何独立于以上任何条件进行处理(返回默认资源?返回404错误?)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.