2015-03-05 6 views
18

मुझे पता है कि @JsonView(...) के साथ नियंत्रक विधियों को स्थगित करना संभव है ताकि स्प्रिंग एमवीसी में एकल दृश्य वर्ग को स्थाई रूप से परिभाषित किया जा सके। दुर्भाग्यवश इसका मतलब है कि मुझे संभवतः हर प्रकार के दृश्य के लिए एक अलग अंतराल की आवश्यकता है।वसंत एमवीसी नियंत्रक में जेसन व्यू का गतिशील चयन

मुझे लगता है कि अन्य लोगों ने यह before पूछा है। हालांकि यह दृष्टिकोण काम कर सकता है, वसंत में अक्सर वही काम करने के कई तरीके होते हैं। कभी-कभी समाधान पहले दिखाई देने से कहीं अधिक सरल हो सकता है यदि आपको कुछ आंतरिकों के बारे में थोड़ा सा ज्ञान है।

मैं एक एकल नियंत्रक एंडपॉइंट रखना चाहता हूं जो मौजूदा प्रिंसिपल के आधार पर उचित दृश्य को गतिशील रूप से चुन सकता है। क्या मेरे लिए Model को एक ऐसे विशेषता के साथ वापस करना संभव है जिसमें उचित दृश्य वर्ग या शायद MappingJacksonValue इंस्टेंस सीधे हो?

मैं org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter#writeInternal में देखते हैं कोड का एक टुकड़ा निर्धारित करता है कि क्या उपयोग करने के लिए देखने नहीं है:

if (value instanceof MappingJacksonValue) { 
      MappingJacksonValue container = (MappingJacksonValue) object; 
      value = container.getValue(); 
      serializationView = container.getSerializationView(); 
     } 

org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyAdvice#beforeBodyWriteInternal से आती दिखायी देती है, लेकिन मैं बाहर काम कर रहा है, तो वहाँ एक रास्ता मैं बाईपास कर सकता है समस्या हो रही है कौन सा यह सिर्फ एक विशेष मूल्य लौटकर जिसमें सही दृश्य चुनने के लिए Jackson2HttpMessageConverter के लिए आवश्यक जानकारी शामिल है।

किसी भी मदद की बहुत सराहना की।

+0

आप एक ContentNegotiatingViewResolver भी कॉन्फ़िगर कर सकते हैं – Richard

उत्तर

28

ऑफ मौके पर कोई और एक ही चीज़ प्राप्त करना चाहता है, यह वास्तव में बहुत आसान है।

आप सीधे अपने नियंत्रक से org.springframework.http.converter.json.MappingJacksonValue उदाहरण वापस कर सकते हैं जिसमें उस ऑब्जेक्ट को शामिल किया गया है जिसे आप क्रमबद्ध करना चाहते हैं और व्यू क्लास।

इसे org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter#writeInternal विधि द्वारा उठाया जाएगा और उचित दृश्य का उपयोग किया जाएगा।

वह कुछ इस तरह काम करता है:

@RequestMapping(value = "/accounts/{id}", method = GET, produces = APPLICATION_JSON_VALUE) 
public MappingJacksonValue getAccount(@PathVariable("id") String accountId, @AuthenticationPrincipal User user) { 
    final Account account = accountService.get(accountId); 
    final MappingJacksonValue result = new MappingJacksonValue(account); 
    final Class<? extends View> view = accountPermissionsService.getViewForUser(user); 
    result.setSerializationView(view); 
    return result; 
} 
5

यहाँ ऊपर जवाब जो मुझे मदद मिली की एक विविधता है। मुझे वसंत HATEOAS पेलोड का उपयोग करते समय सीधे MappingJacksonValue लौटने में समस्याएं मिलीं। अगर मैं इसे सीधे नियंत्रक के हैंडलर से वापस लौटाता हूं, तो किसी कारण से Resources और ResourceSupport मिश्रणों को सही ढंग से लागू नहीं किया जाता है और JSON HAL _ लिंक को लिंक के रूप में प्रस्तुत किया जाता है। वसंत ResponseEntity को प्रस्तुत नहीं किया गया है क्योंकि इसे body और status ऑब्जेक्ट्स को पेलोड में दिखाना चाहिए।

एक ही है कि और के साथ मदद प्राप्त करने के लिए ControllerAdvice का उपयोग करना अब मेरे पेलोड सही ढंग से गाया जाता है और विचारों के रूप में की जरूरत

@ControllerAdvice(assignableTypes = MyController.class) 
public class MyControllerAdvice extends AbstractMappingJacksonResponseBodyAdvice { 

    @Override 
    protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType, MethodParameter returnType, 
             ServerHttpRequest req, ServerHttpResponse res) { 
    ServletServerHttpRequest request = (ServletServerHttpRequest)req; 
    String view = request.getServletRequest().getParameter("view"); 
    if ("hello".equals(view)) { 
     bodyContainer.setSerializationView(HelloView.class); 
    } 
    } 
} 
0

कृपया जांच करें https://github.com/monitorjbl/json-view/ लागू होते हैं, इस का उपयोग करते हुए हम गतिशील JSON क्षेत्रों का चयन करने की समस्या हल हो रनटाइम पर

संबंधित मुद्दे