MockMvc अब स्प्रिंग बूट 2.2.0 के साथ UTF-8 वर्ण संभालती है। कृपया


14

2.2.0.RELEASEस्प्रिंग बूट के नए रिलीज़ किए गए संस्करण में अपग्रेड करने के बाद मेरे कुछ परीक्षण विफल हो गए। ऐसा प्रतीत होता है कि MediaType.APPLICATION_JSON_UTF8हटा दिया गया है और अब नियंत्रक विधियों से डिफ़ॉल्ट सामग्री प्रकार के रूप में वापस नहीं किया गया है जो सामग्री प्रकार को स्पष्ट रूप से निर्दिष्ट नहीं करते हैं।

टेस्ट कोड की तरह

String content = mockMvc.perform(get("/some-api")
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
            .andReturn()
            .getResponse()
            .getContentAsString();

अचानक काम नहीं किया क्योंकि सामग्री प्रकार बेमेल थी जैसा कि नीचे दिखाया गया है

java.lang.AssertionError: Content type 
Expected :application/json;charset=UTF-8
Actual   :application/json

.andExpect(content().contentType(MediaType.APPLICATION_JSON))अब समस्या को हल करने के लिए कोड बदलना ।

लेकिन अब जब contentअपेक्षित क्रमबद्ध वस्तु की तुलना की जाती है तो वस्तु में कोई विशेष वर्ण होने पर भी एक मिसमैच होता है। ऐसा प्रतीत होता है कि .getContentAsString()विधि डिफ़ॉल्ट रूप से (किसी भी अधिक) UTF-8 वर्ण एन्कोडिंग का उपयोग नहीं करती है।

java.lang.AssertionError: Response content expected:<[{"description":"Er hörte leise Schritte hinter sich."}]> but was:<[{"description":"Er hörte leise Schritte hinter sich."}]>
Expected :[{"description":"Er hörte leise Schritte hinter sich."}]
Actual   :[{"description":"Er hörte leise Schritte hinter sich."}]

मैं contentUTF-8 एन्कोडिंग में कैसे प्राप्त कर सकता हूं ?

जवाबों:


7

हाँ। यह 2.2.0 वसंत-बूट से समस्या है। उन्होंने डिफॉल्ट चारसेट एन्कोडिंग के लिए अपग्रेडेशन सेट किया।

.getContentAsString(StandardCharsets.UTF_8) - अच्छा है, लेकिन किसी भी प्रतिक्रिया में डिफ़ॉल्ट रूप से आईएसओ 8859-1 आबादी होगी।

अपनी परियोजना में मैंने वर्तमान निर्मित कनवर्टर को अद्यतन किया:

@Configuration
public class SpringConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.stream()
            .filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
            .findFirst()
            .ifPresent(converter -> ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(UTF_8));
    }
...

यह यहाँ सुझाया गया सबसे आसान उपाय था!
टाइम्स

आपने मेरा दिन बचाया!
फिलामैट


2

डिफ़ॉल्ट एन्कोडिंग चरित्र अब वसंत के 5.2.0 संस्करण के बाद से UTF-8 नहीं है।

UTF-8 का उपयोग जारी रखने के लिए, आपको इसे MockMvc परिणाम के ServletResponse में सेट करना होगा। UTF-8 में डिफ़ॉल्ट वर्ण एन्कोडिंग सेट करने के लिए, अपनी सेटअप विधि में कुछ इस तरह करें:

@Before
public void setUp() {
   mockMvc = webAppContextSetup(wac).addFilter(((request, response, chain) -> {
                response.setCharacterEncoding("UTF-8");
                chain.doFilter(request, response);
            })).build();
}

तब आप अपने अनुरोध को करने के लिए mockMvc उदाहरण का उपयोग कर सकते हैं।

उममीद है कि इससे मदद मिलेगी।


इस समाधान के साथ मुझे हर परीक्षण वर्ग में mockMvc को कॉन्फ़िगर करना होगा। यह कई परीक्षण कक्षाओं के लिए काफी थकाऊ हो सकता है!
टाइम्स

0

वसंत डेवलपर्स के इस पुल अनुरोध के अनुसार UTF-8 हेडर की अब आवश्यकता नहीं है और इसलिए इसे हटा दिया गया है। यदि आप अपने आवेदन में UTF-8 हेडर का उपयोग कर रहे हैं तो आप अपने परीक्षण को ठीक करने के बजाय इसे अपने आवेदन से हटाने पर विचार कर सकते हैं। बस सुनिश्चित करें कि आप सामग्री-प्रकार: एप्लिकेशन / जसन हेडर का उपयोग कर रहे हैं और आपको ठीक होना चाहिए।


मुझे लगता है कि आप समस्या को नहीं समझते हैं। मेरा सुझाव है कि आप पूरे प्रश्न को पढ़ें और फिर मूल्यांकन करें, यदि आपका उत्तर किसी भी मूल्य को वितरित करता है। मेरा आवेदन पूरी तरह से ठीक है, समस्या परीक्षण से संबंधित है।
टाइम्स

मैंने पूरे प्रश्न को फिर से पढ़ा और मेरे उत्तर को फिर से याद किया, उत्तर अभी भी वही है। आपके प्रश्न में आप यह नहीं समझाते हैं कि शीर्ष लेख को क्यों निकाला गया है, मैंने आपके प्रश्न को अपनी पोस्ट से समृद्ध किया। मेरा सुझाव है कि आप जिस पीआर से जुड़े हैं, उसे पढ़ें, ताकि आप समझ सकें कि हेडर क्यों निकाला गया है। यदि आप समझते हैं कि क्यों, आप अपने परीक्षण को बदलने पर विचार करना चाह सकते हैं क्योंकि आपका परीक्षण स्प्रिंग 2.1.X में डिफ़ॉल्ट व्यवहार का परीक्षण कर रहा है, लेकिन यह स्प्रिंग 2.2.X में व्यवहार का सही तरीके से परीक्षण नहीं करता है। स्प्रिंग व्यवहार बदल गया, यदि आप नए स्प्रिंग व्यवहार को स्वीकार करते हैं तो आपके परीक्षण के अनुसार परिवर्तन होना चाहिए।
स्क्रू_डब्लू

आप यहाँ बहुत सुसंगत नहीं हैं। अपने जवाब में आप कहते हैं "[...] बजाय अपने परीक्षण को ठीक करने के"। अपनी टिप्पणी में आप कहते हैं "[...] आपके परीक्षण को तदनुसार बदलना चाहिए यदि आप नए वसंत व्यवहार को स्वीकार करते हैं।"
टाइम्स

हर प्रोग्रामर को अब और फिर मूल्यों का अभाव होता है। जब किसी चीज को अपदस्थ किया जाता है, तो आप इसे बिना शोध के किसी भी तरह से ठीक कर सकते हैं कि यह पहले स्थान पर क्यों मिला। यह तरीका आपको इस समस्या से निपटने का तरीका प्रतीत हो रहा है। अब मैं आपको सुझाव देता हूं कि आप आगे देखें और शोध करें कि यह पदावनत क्यों हुआ । यदि आप समझते हैं कि, आप बेहतर निर्णय ले सकते हैं कि आगे क्या करना है। आपके प्रश्न में इस बात के बारे में कुछ भी नहीं है कि आप हमें केवल यह क्यों बताते हैं कि आपका परीक्षण एक खराब मूल्य के कारण विफल हो रहा है जो कि खराब शोध है। मैं कुछ शोध तुम नहीं किया साथ सवाल समृद्ध और upvoted प्र
scre_www

0

मैं स्प्रिंग बूट 1.5.15 का उपयोग कर रहा हूं। कृपया और परीक्षण लिखते समय इसी मुद्दे का सामना करें।

पहला समाधान जिसने मुझे जोड़ने में मदद की। इस तरह .characterEncoding ("UTF-8") को जोड़ना था:

String content = mockMvc.perform(get("/some-api")
            .contentType(MediaType.APPLICATION_JSON)
            .characterEncoding("UTF-8"))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
            .andReturn()
            .getResponse()
            .getContentAsString();

मैं अपने परीक्षण वर्ग में एक स्टैंडअलोनमॉकमिक्स पीवीसी का उपयोग कर रहा हूं, इसलिए दूसरा समाधान जिसने मुझे एक फ़िल्टर बनाने में मदद की:

private static class Utf8Filter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
        response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
        filterChain.doFilter(request, response);
    }
}

और बाद में इसे इस तरह मेरी टेस्ट क्लास में स्टैंडअलोन सेटअप विधि में जोड़ें:

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    final SomeResource someResource = new SomeResource(someService);
    this.restLankMockMvc = MockMvcBuilders.standaloneSetup(someResource)
        .setCustomArgumentResolvers(pageableArgumentResolver)
        .setControllerAdvice(exceptionTranslator)
        .setConversionService(createFormattingConversionService())
        .setMessageConverters(jacksonMessageConverter)
        .addFilter(new Utf8Filter())
        .build();
}

0

MockMvc के लिए अतिरिक्त सेटिंग .accept(MediaType.APPLICATION_JSON_UTF8_VALUE):

    String content = mockMvc.perform(get("/some-api")
        .contentType(MediaType.APPLICATION_JSON)
        .accept(MediaType.APPLICATION_JSON_UTF8_VALUE))
        .andExpect(status().isOk())
        .andExpect(content().contentType(MediaType.APPLICATION_JSON))
        .andReturn()
        .getResponse()
        .getContentAsString();

यह समस्या स्प्रिंग बूट नहीं है, लेकिन MockMvc विशिष्ट एक है, मुझे लगता है। इसलिए, केवल MockMvc पर वर्कअराउंड लागू किया जाना चाहिए। ( JSON को UTF-8 का उपयोग करके एन्कोड किया जाना चाहिए ।)

संबंधित मुद्दा: JSON प्रतिक्रिया के लिए MockMvc में अनुचित UTF-8 हैंडलिंग · समस्या # 23622 · वसंत-परियोजनाएं / वसंत-रूपरेखा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.