2011-03-22 5 views
7

Denetim MVC'leri Spring MVC kullanıyorum, sorum, döndürülecek ve döndürülen bir JSON'a dönüştürülen @ResponseBody nesnesinden farklı bir JSON yanıtı nasıl döndürebilirim.Spring MVC dönen JSONS ve özel durum İşleme

başka ayrıntı için, ben nesne artık

@ResponseBody UserDetails 

döndü json

{isim gibi bakacağız "ad", "EMAILADDRESS" denilen iki alan vardır "UserDetails" çağrısında : "TheUsersName", emailAddress: "[email protected]"}

Ben dönmeden önce json değiştirebilir herhangi bir şekilde (A var mı Bir "durum" alanı eklenecek ve diğer json verileri json "veri" anahtarı altında olacak tüm kontrolörler genelinde tüm yöntemler LL jsons). ve istisna adını (en az durum parçası olsa da)

+0

belki de ilgili: http://stackoverflow.com/questions/6014784/serialize-specific-exceptions-with-spring-mvc – Bozho

cevap

2

Evet:

Ayrıca bir yerlerden java sunucu bir istisna atar zaman önyüz için bir json dönmek, nasıl json "yanlış statü" olmalıdır. Bunun yerine bir model ve bir görünüm döndür.

public ModelMap getUserDetails() { 
    UserDetails userDetails; // get this object from somewhere 
    ModelMap map = new ModelMap()(; 
    map.addAttribute("data", userDetails); 
    map.addAttribute("success", true); 
    return map; 
} 

Eğer yanlış bir anahtar ve başarı = ile aynı şekilde yapardım istisna ekleyin.

public class BadStatus { 
    String errorMessage; 
    boolean status = false; 

    public BadStatus(String msg) { errorMessage = msg; } 
} 

@ExceptionHandler(Exception.class) 
public BadStatus handleException(Exception ex, HttpServletRequest request) { 
    return new BadStatus(ex.getMessage()); 
} 
+0

ModelAndView'ın hangi değeri eklediğini göremiyorum. Neden sadece 'ModelMap' i iade etmiyorsun? – skaffman

+0

ModelAndView'ı neden kullanmak istediğime emin değilim, ancak bana bir çekicilik gibi çalışan bir haritayı (HashMap) kullanma fikrini verdiniz ve bana istenen çıktıyı verdiler. Ancak, aynısını başarısız senaryoda nasıl yaparım? Ancak, tüm kontrolörler ve kontrol cihazlarındaki tüm fonksiyonlar için bunu merkezileştirmenin bir yolu nedir? – MilindaD

+0

@skaffman Haklısınız. Beyin osurukları da geri dönüyor. @milindaD ModelMap anahtar gerektirmez, ancak çok farklı değil. Harita uygular. –

14

bir yanıt sınıf oluşturun Daha az invaziv olan

olan alternatif bir çözüm (yay 3.1 ile çalışır) bahar config

:

<bean id="jacksonConverter"  class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="mypackage.MyMessageConverter" 
      p:delegate-ref="jacksonConverter"> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

fikri kendi HttpMessageConverter sağlamaktır şartıyla jackson dönüştürücü delegeler.

public class MyMessageConverter implements HttpMessageConverter<Object> { 
// setters and delegating overrides ommitted for brevity 
@Override 
    public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, 
      HttpMessageNotWritableException { 
// t is whatever your @ResponseBody annotated methods return 
     MyPojoWrapper response = new MyPojoWrapper(t); 

     delegate.write(response, contentType, outputMessage); 
    } 
} 

Bu şekilde tüm pojoslarınız, orada sağladığınız başka bir jsonla sarılır.

Kural dışı durumlar için, ericacm tarafından önerilen çözüm gitmenin en kolay yoludur ('BadStatus' döndürme türünü @ResponseBody ile ekleyerek eklemeyi unutmayın).

Bir uyarı: json seri hale getirilmiş BadStatus'unuz MyMessageConverter üzerinden de geçer, bu nedenle nesne türü için geçersiz 'yazma' yönteminde sınamak veya MyPojoWrapper'ın bunu işlemesini sağlamak isteyeceksiniz.

+0

Daha ayrıntılı bir cevap için bu konuya bakın: http://stackoverflow.com/questions/5641091/spring-3-exception-handling-using-json – Sydney

2

: sizin gibi bir nesne dönmek isteyeceksiniz istisna için

@ResponseBody public Response getUserDetails) { 
    //... 
    return new Response(userDetails); 
} 

:

public class Response<T> { 
    T data; 
    boolean status = true; 

    public Response(T d) { data = d; } 
} 

Ardından denetleyicileri o dönmek: