2012-06-05 60 views
4

我正在爲我的REST風格的Web服務創建客戶端。 在這種情況下,我的服務器不會總是返回期望的對象(例如,在給定參數上找不到任何東西,所以返回值爲NULL)。REST風格Web服務的返回值,將空值考慮到

@GET 
@Path("/person/{name}") 
@Produces("application/xml") 
public Person getPerson(@PathParam("name") String name) { 
    return people.byName(name); 
} 

如果找不到給定的名稱,byName()方法將返回NULL。在解組給定的對象時,這會引發異常。只是導致if/else語句或以不同方式處理回報的最常用和最簡單的方法是什麼?

JAXBContext jcUnmarshaller = JAXBContext.newInstance(Person.class); 
Unmarshaller unmarshaller = jcUnmarshaller.createUnmarshaller(); 
return (Person) unmarshaller.unmarshal(connection.getInputStream()); 

SOLUTION

getPerson() throws WebApplicationException { 
    throw new WebApplicationException(404); 
} 
+0

「拋出WebApplicationException」 簽名是無用的,因爲WebApplicationException是一個RuntimeException。 – fabdouglas

回答

8

來處理這種情況的慣用方式是返回404未找到響應代碼。隨着你可以扔掉WebApplicationException

@GET 
@Path("/person/{name}") 
@Produces("application/xml") 
public Person getPerson(@PathParam("name") String name) { 
    Person personOrNull = people.byName(name); 
    if(personOrNull == null) { 
     throw new WebApplicationException(404); 
    } 
    return personOrNull; 
} 
+0

這個例子也會拋出異常,謝謝你的幫助! – Aquillo

+0

嘗試了這一點,我的JBoss服務器日誌現在散佈着異常。使真正的錯誤跟蹤棘手。 –

+0

@SeanCoetzee:使用NoLogWebApplicationException而不是WebApplicationException將異常保留在日誌之外。 – chrsalln

2

如果你正在尋找一個純粹的REST服務,您應該返回的HTTP響應代碼404 - 當找不到一個人沒有找到。因此,這將是這個樣子:

public Person getPerson(@PathParam("name") String name) { 
    Person person = people.byName(name); 
    if (null != person) { 
     return person 
    } 
    else { 
     //return 404 response code (not sure how to do that with what you're using) 
    } 
} 
+0

請參閱我的回答,瞭解如何在[tag:jax-rs]中返回404。然而,+1,你是第一個。 –

+0

太好了,那正是我需要的! – Aquillo