2011-05-12 2 views
5

데이터베이스에 저장된 정보에 액세스하도록 설정된 REST 서비스가 있습니다.여러 유형의 REST PathParam

상품의 id 또는 name을 기반으로 액세스하고 싶습니다.

그래서 내가 기록

name | id | description 
mine | 65 | "my thing" 
있어 말할 수 내가 통해이 항목에 액세스 할 수 있도록하고 싶습니다

중 하나 : 나는 뉴저지 (자바 라이브러리)을 사용하고

myurl.com/items/65 
myurl.com/items/mine 

. PathParam을 정의하여 object.typeOf()를 사용하지 않고 int 또는 String을 허용 할 수있는 방법이 있습니까? 당신이 "깨끗한"솔루션을 찾고 있다면

@PATH("/items/{identifier} 
@GET 
public String getItem(@PathParam("identifier") Object identifier){ 
    if(identifier.typeOf().equals(String.typeOf())).... 

}

감사

+0

'.typeOf()'대신'.class'를 사용합니까? – Jeremy

+0

저는 typeOf() 비트를 자유롭게 만들 수있었습니다. 마이크의 대답은 올바른 Java 구문을 보여줍니다. 그래도 잘 잡는다. 감사! –

+0

Jochen은 아래에서 이것을 언급했으나 강조 할 가치가 있습니다. "4711"을 이름으로 사용하는 것이 가능하다면이 전체 계획은 실패 할 운명입니다. 그래서 일어날 수 없는지 확인하십시오! :) – MatrixFrog

답변

4

- 나는 일이 있다고 생각하지 않습니다

나는이를 방지하고 싶습니다. 그러나 당신이 할 수 있습니다 : 또한

@PATH("/items/{identifier}") 
public String getItem(@PathParam("identifier") String identifier){ 
    try { 
     return getByID(Long.parseLong(identifier)); 
    } catch (NumberFormatException ex) { 
     return getByName(identifier); 
    } 
} 

,이 컴파일되지 않습니다 - typeOf() 같은 그런 방법이 없습니다 :

if(identifier.typeOf().equals(String.typeOf())) 

난 당신이 의미하는 생각이 :

if (identifier instanceof String) 

EDIT : 어쨌든 원래의 아이디어 (매개 변수 유형을 Object, 정확한 인스턴스 유형 확인)가 작동하지 않습니다. 컨테이너는 path 요소가 정수일 수 있다는 것을 알 수 없으므로이를 정수로 파싱하지 않으며 매번 String을 제공합니다.

+0

+1 문자열을 사용하고 필요한 경우 길게 파싱하는 것이 가장 깨끗한 방법입니다. – fmucar

+0

'긴'문장을 파싱하려는 시도에 대한 훌륭한 아이디어. 감사! –

+3

누군가가 함께 와서 4711 항목에 이름을 붙이지 않는 한 ... –

관련 문제