स्प्रिंग एमवीसी आरईएसटी डिफ़ॉल्ट रूप से एक्सएमएल का उत्पादन करता है

मुझे स्प्रिंग एमवीसी और आरईएसटी के साथ समस्या है। समस्या यह है कि जब मैं एक्सटेंशन के बिना यूआरएल पोस्ट करता हूं या जो भी एक्सटेंशन अन्य जेसन या एचटीएमएल या एचटीएम मुझे हमेशा एक्सएमएल प्रतिक्रिया मिल रहा है। लेकिन मैं इसे टेक्स्ट/एचटीएमएल प्रतिक्रिया के लिए डिफ़ॉल्ट करना चाहता हूं। मैं कई विषयों में खोज रहा था और इस पर answear नहीं मिल सकता।

यहां मेरा नियंत्रक वर्ग है:

@RequestMapping(value="/user/{username}", method=RequestMethod.GET)
public String showUserDetails(@PathVariable String username, Model model){
    model.addAttribute(userManager.getUser(username));
    return "userDetails";
}

@RequestMapping(value = "/user/{username}", method = RequestMethod.GET,   
        produces={"application/xml", "application/json"})  
@ResponseStatus(HttpStatus.OK)
public @ResponseBody 
    User getUser(@PathVariable String username) {
    return userManager.getUser(username);
}

यहां मेरा एमवीसी संदर्भ कॉन्फ़िगरेशन है:






    
      
    
       
         
         
       
     

   


    
        
            org.springframework.web.servlet.view.tiles3.TilesView
        
    


    
        
            /WEB-INF/tiles.xml
        
    

दरअसल जब मैंने एक्लिप्स ब्राउज़र में निर्मित करने की कोशिश की तो यह ठीक काम करता है, लेकिन जब मैं फ़ायरफ़ॉक्स या क्रोम का उपयोग करता हूं तो यह बिना किसी एक्सटेंशन के अनुरोध पर एक्सएमएल प्रतिक्रिया दिखाता है। मैंने ignoreAcceptHeader का उपयोग करने का प्रयास किया, लेकिन कोई बदलाव नहीं हुआ।

आईई पर भी काम करता है: /

अगर किसी के पास कोई विचार है तो कृपया मदद करें, धन्यवाद।

3
क्या आपने @RequestMapping में {"application/json", "application/xml"} में उत्पादित मीडिया प्रकारों के क्रम को बदलने की कोशिश की है? मुझे पता है कि सीएक्सएफ में काम करता है। शायद यह स्प्रिंग एमवीसी के लिए करेगा।
जोड़ा लेखक Aleksandr Kravets, स्रोत

2 उत्तर

मुझे वास्तव में यह पता चला कि यह कैसे करना है, मैं वास्तव में समझ नहीं पा रहा हूं कि यह क्यों काम कर रहा है, लेकिन मैंने contentresolver पर डिफ़ॉल्ट दृश्य जोड़े जैसे:


    
      <!-- JSON View -->
      
      

      <!-- JAXB xml View -->
      
        
            
               
                
                   com.chodak.tx.model.User
                
               
            
        
      
     
  

और getUser विधि को हटा दिया, जिसे एक्सएमएल और जेसन का उत्पादन करने के लिए एनोट किया गया था। अगर मैं इसे अतिरिक्त डिफ़ॉल्ट दृश्यों के साथ छोड़ देता हूं तो यह अभी भी काम नहीं कर रहा है। अगर कोई समझा सकता है कि यह कमाल क्यों होगा :)

1
जोड़ा

तुम कर सकते हो

import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
// @EnableWebMvc already autoconfigured by Spring Boot
public class MvcConfiguration {

@Bean
public WebMvcConfigurer contentNegotiationConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
            configurer.favorPathExtension(false)
                    .favorParameter(true)
                    .parameterName("mediaType")
                    .ignoreAcceptHeader(true)
                    .useJaf(false)
                    .defaultContentType(MediaType.APPLICATION_JSON)
                    .mediaType("xml", MediaType.APPLICATION_XML)
                    .mediaType("json", MediaType.APPLICATION_JSON);
           //this line alone gave me xhtml for some reason
           //configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8);
        }
    };
}

(स्प्रिंग बूट 1.5.x के साथ कोशिश की)

see https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

"हमने दोनों मामलों में क्या किया:

  • अक्षम पथ एक्सटेंशन। ध्यान दें कि पक्ष का मतलब किसी अन्य दृष्टिकोण में प्राथमिकता में एक दृष्टिकोण का उपयोग नहीं करना है, यह सिर्फ इसे सक्षम या अक्षम करता है। जांच का क्रम हमेशा पथ एक्सटेंशन, पैरामीटर, हेडर स्वीकार करें।

  • यूआरएल पैरामीटर के उपयोग को सक्षम करें, लेकिन डिफ़ॉल्ट पैरामीटर, format का उपयोग करने के बजाय, हम इसके बजाय mediaType का उपयोग करेंगे।

  • स्वीकार करें शीर्षलेख को पूरी तरह से अनदेखा करें। यदि आपके ज्यादातर ग्राहक वास्तव में वेब-ब्राउज़र (आमतौर पर AJAX के माध्यम से आरईएसटी कॉल कर रहे हैं) तो यह सबसे अच्छा तरीका है।

  • जेएएफ का उपयोग न करें, इसके बजाय मीडिया प्रकार मैपिंग मैन्युअल रूप से निर्दिष्ट करें - हम केवल JSON और xml का समर्थन करना चाहते हैं। "

0
जोड़ा