2010-05-20 28 views
11

Amacım, bir nesne bulunmadığında bir açıklayıcı mesajla birlikte 404'te döndürülen bir hata çekirdeğinin bulunması ve istenen MIME türünün döndürülmesidir.Jersey'deki İstisnalar İçin JSON veya XML Dönüyor

ben başlığı Kabul ihtiyacım yok URI dayalı XML veya JSON belirtilen nesne (Ben kurulum böylece com.sun.jersey.config.property.resourceConfigClass servlet parametresini dönecektir bir bakmak kaynak var JAXBContextResolver, tür listesinde ErrorBean.class var ve bu sınıf için doğru JAXBContext döndürülür çünkü günlükleri görebiliyorum).

örn: http://foobar.com/rest/locations/1.json

@GET 
@Path("{id}") 
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
public Location getCustomer(@PathParam("id") int cId) { 
    //look up location from datastore 
    .... 
    if (location == null) { 
     throw new NotFoundException("Location" + cId + " is not found"); 
    } 

} 

Ve NotFoundException şöyle görünür:

public class NotFoundException extends WebApplicationException { 

    public NotFoundException(String message) { 
     super(Response.status(Response.Status.NOT_FOUND). 
       entity(new 
         ErrorBean(
          message, 
          Response.Status.NOT_FOUND.getStatusCode() 
         ) 
       .build()); 
    } 

} 

ErrorBean aşağıdaki gibidir: Ancak

@XmlRootElement(name = "error") 
public class ErrorBean { 

    private String errorMsg; 
    private int errorCode; 

     //no-arg constructor, property constructor, getter and setters 
     ... 

} 

, hep bir alıyorum 204 Denediğimde İçerik Yok yanıtı bu. Etrafa hacklenmiş ettim ve bir dize döndürür ve mim türünü belirtirseniz bu iyi çalışır:

public NotFoundException(String message) { 
    super(Response.status(Response.Status.NOT_FOUND). 
      entity(message).type("text/plain").build()); 
} 

Ben de bir kaynak olarak bir ErrorBean dönen çalıştılar. Bu çalışıyor:

gelecekte benzer sorunları olanlar için
{"errorCode":404,"errorMsg":"Location 1 is not found!"} 

cevap

9

...

benim kod sonunda Tamam olduğu ortaya çıktı. Saçımı çekiyordum, bu yüzden bu modülü tekrar yazdım ve hala hiçbir yere gitmiyordum. Tarayıcım sadece orada oturacak ve sonsuza dek asılacaktı. Başlıkları LiveHTTPHeaders (firefox add-on) ile incelemeye başladım ve bu sırada Content-Length'ın sıfırdan büyük olduğunu fark ettim. Daha sonra hurl.it ile test ettim ve vücudun normale döndüğünü öğrendim. Tarayıcı XML yanıtını iyi bir şekilde ele alır, ancak JSON'u (dolayısıyla asılı) görüntülemez. Bu sadece benim için değil, kullanıcılar için değil, uygulama tüketimi için bir API olduğu için gayet iyi. Jersey wiki adresindeki istisnaları eşleme hakkında bilgi vardır.

HTTP/1.1 404 Not Found 
Content-Type: application/json 
Date: Fri, 21 May 2010 06:39:28 GMT 
Server: Google Frontend 
Cache-Control: private, x-gzip-ok="" 
Transfer-Encoding: chunked 

{ 
    "errorCode": "404", 
    "errorMsg": "Could not retrieve entity of kind Location with key Location(10)" 
} 
İlgili konular