মকএমভিসি আর ইউটিএফ -8 অক্ষরগুলি স্প্রিং বুট ২.২.০. এর সাথে পরিচালনা করে না RE


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()পদ্ধতিটি ইউটিএফ -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."}]

আমি কীভাবে contentইউটিএফ -8 এনকোডিংয়ে যাব ?

উত্তর:


7

হ্যাঁ. এটি 2.2.0 বসন্ত-বুট থেকে সমস্যা problem তারা ডিফল্ট চরসেট এনকোডিংয়ের জন্য অবচয় নির্ধারণ করেছে।

.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 সংস্করণ থেকে ডিফল্ট এনকোডিং অক্ষরটি আর ইউটিএফ -8 নয়।

ইউটিএফ -8 ব্যবহার চালিয়ে যেতে, আপনাকে অবশ্যই এটি মকএমভিসি ফলাফলের সার্লেটলেসপসনে সেট করতে হবে। ইউটিএফ -8 এ ডিফল্ট অক্ষর এনকোডিং সেট করতে আপনার সেটআপ পদ্ধতিতে এটির মতো কিছু করুন:

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

তারপরে আপনি আপনার অনুরোধটি সম্পাদন করতে mockMvc উদাহরণটি ব্যবহার করতে পারেন।

এই সাহায্য আশা করি।


এই সমাধানের সাথে আমাকে প্রতিটি পরীক্ষার ক্লাসে মকএমভিসি কনফিগার করতে হবে। এটি অনেক পরীক্ষার ক্লাসের জন্য বেশ ক্লান্তিকর হতে পারে!
টাইমস

0

বসন্ত বিকাশকারীদের এই টান অনুরোধ অনুসারে ইউটিএফ -8 শিরোনামের আর প্রয়োজন হয় না এবং তাই এটি হ্রাস করা হয়। আপনি যদি আপনার অ্যাপ্লিকেশনটিতে ইউটিএফ -8 শিরোনাম ব্যবহার করে থাকেন তবে আপনি নিজের পরীক্ষাটি ঠিক করার চেষ্টা করার পরিবর্তে আপনার অ্যাপ্লিকেশন থেকে এটিকে অপসারণের বিষয়টি বিবেচনা করতে পারেন। কেবল নিশ্চিত হয়ে নিন যে আপনি সামগ্রী-প্রকার: অ্যাপ্লিকেশন / জেসন শিরোনাম ব্যবহার করছেন এবং আপনার ভাল হওয়া উচিত।


আমি মনে করি আপনি সমস্যাটি বুঝতে পারছেন না। আমি আপনাকে পুরো প্রশ্নটি পড়ার পরামর্শ দিচ্ছি এবং তারপরে পুনরায় মূল্যায়ন করুন, যদি আপনার উত্তরটি কোনও মান দেয়। আমার অ্যাপ্লিকেশনটি পুরোপুরি ঠিকঠাক হয়ে উঠছে, সমস্যাটি পরীক্ষাগুলির সাথে সম্পর্কিত।
টাইমস

আমি পুরো প্রশ্নটি আবার পড়েছি এবং আমার উত্তরটি পুনরায় মূল্যায়ন করেছি, উত্তরটি এখনও একই। আপনার প্রশ্নে আপনি কেন শিরোনাম হ্রাস করা হয়েছে তা ব্যাখ্যা করবেন না , আমি আপনার প্রশ্নটি আমার পোস্ট দিয়ে সমৃদ্ধ করেছি। আমি আপনাকে যে PR টি লিঙ্ক করেছি সেগুলি পড়ার পরামর্শ দিচ্ছি, যাতে আপনি বুঝতে পারেন কেন শিরোনামটি হ্রাস করা হয়েছে। আপনি যদি এর কারণটি বুঝতে পারেন তবে আপনি নিজের পরীক্ষাটি পরিবর্তনের বিষয়ে বিবেচনা করতে পারেন যেহেতু আপনার পরীক্ষাটি বসন্ত ২.১.এক্সে ডিফল্ট আচরণের পরীক্ষা করছে, তবে এটি বসন্ত ২.২.এক্সের আচরণটি সঠিকভাবে পরীক্ষা করে না। বসন্তের আচরণ বদলেছে, আপনি যদি নতুন বসন্তের আচরণটি গ্রহণ করেন তবে সেই অনুযায়ী আপনার পরীক্ষাটি পরিবর্তন হওয়া উচিত।
স্ক্রিজ_উজব

আপনি এখানে খুব সামঞ্জস্যপূর্ণ হয় না। আপনার উত্তরে আপনি বলছেন "[...] পরিবর্তে আপনার পরীক্ষা ঠিক করার চেষ্টা করুন"। আপনার মন্তব্যে আপনি বলেছেন "[...] আপনি যদি নতুন বসন্ত আচরণ স্বীকার করেন তবে আপনার পরীক্ষাটি সেই অনুযায়ী পরিবর্তন হওয়া উচিত"।
টাইমস

প্রতিটি প্রোগ্রামার এখন এবং তারপরে অবচিত মূল্যবোধগুলির মুখোমুখি। যখন কোনও কিছু হ্রাস করা হয়, আপনি কেন এটি প্রথম স্থানে নষ্ট হয়ে গেল তা নিয়ে গবেষণা না করে কোনওভাবে এটি ঠিক করতে পারেন । এই পদ্ধতির মাধ্যমে আপনি এই সমস্যাটি পরিচালনা করছেন বলে মনে হচ্ছে। এখন আমি আপনাকে আরও সন্ধান করার পরামর্শ দিচ্ছি এবং কেন এটি হ্রাস পেয়েছে তা নিয়ে গবেষণা করুন । যদি আপনি এটি বুঝতে পারেন তবে আপনি পরবর্তী কী করবেন সে সম্পর্কে আপনি আরও ভাল সিদ্ধান্ত নিতে পারেন। আপনার প্রশ্নে কেন আপনি কেবল আমাদের বলছেন যে কেন আপনার পরীক্ষা হ্রাস করা মূল্যের কারণে ব্যর্থ হচ্ছে যা খারাপ গবেষণা নয় about আপনি যে গবেষণাটি করেননি সেগুলি দিয়ে আমি প্রশ্নটি সমৃদ্ধ করেছিলাম এবং Q.
স্ক্রিজডউইউউব

0

আমি স্প্রিং বুট 1.5.15 ব্যবহার করছি RE নিখরচায় এবং পরীক্ষা লেখার সময় একই সমস্যার মুখোমুখি হয়েছি।

আমাকে যে প্রথম সমাধানটি সাহায্য করেছিল তা হ'ল।

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

মকএমভিসি-তে অতিরিক্ত সেটিং .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();

আমার ধারণা, এই সমস্যাটি স্প্রিং বুট নয়, তবে মকএমভিসি নির্দিষ্ট একটি। সুতরাং, কেবলমাত্র মকএমভিসি-তে অবশ্যই একটি কার্যকর প্রয়োগ করতে হবে। ( ইউএসএফ -8 ব্যবহার করে জেএসএনকে অবশ্যই এনকোড করা উচিত ))

সম্পর্কিত সমস্যা: JSON প্রতিক্রিয়ার জন্য মকএমভিসিতে ভুল ইউটিএফ -8 হ্যান্ডলিং · সমস্যা # 23622 · বসন্ত-প্রকল্পগুলি / বসন্ত-ফ্রেমওয়ার্ক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.