JAX-RS @PathParam에서 날짜 유형을 사용해야합니까?


9

이것이 Jersey를 사용하여 JEE Glassfish 서버에서 수행 할 생각입니다.

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

이 RESTful 웹 서비스를 사용하는 사람들에게 "여기의 날짜는 Java의 Date 클래스와 호환되는 모든 것"이라고 말할 수 있다는 아이디어가 마음에 듭니다. 그것은 날짜 사양을 볼 수 있다는 관점에서 꽤 간단하며 이미 테스트 할 수있는 작동 모델이 있습니다.

내가 걱정하는 문제는 Date ()가 생성자에서 얻는 것을 좋아하지 않을 때 JAX-RS가 그렇게 좋지 않다는 것입니다. 주어진 내용을 구문 분석 할 수없는 경우 Date ()에서 오류가 발생하므로 (실제 날짜 대신 "today"문자열을 전달하는 경우와 같이) JEE 서버는 404 오류를 리턴합니다.

이것이 좋은 습관입니까? 내가 생각하지 않는 더 좋은 방법이 있습니까?

답변:


8

나쁜 생각 인 것 같습니다. 우선, Java 1.1 이후 DateFormat.parseDate ()를 선호하는 Date 생성자가 더 이상 사용되지 않습니다. 정확한 지역마다 규칙이 다르기 때문에 문자열을 날짜로 구문 분석하는 방법이 명확하지 않기 때문입니다.

내 권장 사항은 특정 형식, 바람직하게는 국제적으로 이해되는 yyyy-MM-dd를 고수하고 DateFormat을 사용하여 서비스 내부의 문자열에서 날짜를 구문 분석하여 웹 서비스를 소비하는 방법을 명확하게하고 오류 메시지를 반환하기위한 표준 규칙에 따라 웹 서비스에 문제가있을 때이를 따르십시오.


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정의되지 않은 날짜 값에 대해 공개 정적 최종 필드로 확장 할 수 있습니다 . 이렇게하면 정의되지 않은 날짜 매개 변수에 대한 테스트가 더 명확 해집니다.

여기서 한 가지 단점은 각 DateParam에 대해 SimpleDateFormat의 새 인스턴스가 작성된다는 것입니다. 그러나 SimpleDateFormat은 스레드로부터 안전하지 않으므로 쉽게 재사용 할 수 없습니다.


3
1+. Java 8은 스레드 안전을 도입했습니다 DateTimeFormatter. Java <= 7의 경우ThreadLocal
Anthony Accioly를

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 오류를 반환 하시겠습니까?).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.