এই সমস্যাটি আমাকে পাগল করেছে: স্প্রিং এমন একটি শক্তিশালী সরঞ্জাম এবং তবুও, জেএসওএন হিসাবে আউটপুট স্ট্রিংয়ের মতো সহজ জিনিসটি কুৎসিত হ্যাক ছাড়া অসম্ভব বলে মনে হয়।
আমার সমাধান (কোটলিনে) যে আমি সবচেয়ে কম ইন্দুসিভযুক্ত এবং সর্বাধিক স্বচ্ছ বলে মনে করি তা হল একটি নিয়ামক পরামর্শ ব্যবহার করা এবং অনুরোধটি নির্দিষ্ট বিন্দুগুলির একটি নির্দিষ্ট সেটে গিয়েছিল কিনা তা যাচাই করা (REST এপিআই সাধারণত সাধারণত যেহেতু আমরা প্রায়শই এখানে থেকে সমস্ত উত্তর জেএসএন হিসাবে ফিরিয়ে দিতে চাইছি) এবং প্রত্যাবর্তিত তথ্যগুলি সরল স্ট্রিং ("জেএসএন ডিসরিয়ালিশন করবেন না!") বা অন্য কিছু ("জেএসএন ডিসরিয়ালিশন করুন!")) এর ভিত্তিতে সীমান্তে বিশেষীকরণ করবেন না। এর ইতিবাচক দিকটি হ'ল কন্ট্রোলারটি একই এবং হ্যাক ছাড়াই থাকে।
supports
পদ্ধতি নিশ্চিন্ত হন যে সমস্ত অনুরোধ দ্বারা পরিচালিত হয় করে নির্মিত হয় StringHttpMessageConverter
(যেমন রূপান্তরকারী যে হ্যান্ডলগুলি সব কন্ট্রোলার যে প্লেইন স্ট্রিং আসতে আউটপুট) প্রসেস করা হয় এবং beforeBodyWrite
পদ্ধতি, আমরা যা ক্ষেত্রেই নিয়ন্ত্রণ আমরা সাময়িক বিরতি এবং JSON আউটপুট রূপান্তর করতে চান (এবং সেই অনুসারে শিরোনাম সংশোধন করুন)।
@ControllerAdvice
class StringToJsonAdvice(val ob: ObjectMapper) : ResponseBodyAdvice<Any?> {
override fun supports(returnType: MethodParameter, converterType: Class<out HttpMessageConverter<*>>): Boolean =
converterType === StringHttpMessageConverter::class.java
override fun beforeBodyWrite(
body: Any?,
returnType: MethodParameter,
selectedContentType: MediaType,
selectedConverterType: Class<out HttpMessageConverter<*>>,
request: ServerHttpRequest,
response: ServerHttpResponse
): Any? {
return if (request.uri.path.contains("api")) {
response.getHeaders().contentType = MediaType.APPLICATION_JSON
ob.writeValueAsString(body)
} else body
}
}
আমি ভবিষ্যতে আশা করি যে আমরা একটি সাধারণ টীকা পেয়ে যাব যাতে আমরা ওভাররাইড করতে পারি যা HttpMessageConverter
আউটপুটটির জন্য ব্যবহার করা উচিত।