SpringMVC و @التكوين:سجل ConversionService و HttpMessageConverter
-
22-12-2019 - |
سؤال
أنا حقا أحب الربيع @التكوين أسلوب للتخلص من xml القائمة على التكوين.أنا استخدامها بنجاح من أجل خدمة مستودع طبقة.ما أحب أيضا هو حقن التبعية الميزة و JDO/JPA/Jdbc المرافق!
ما أنا لا أفهم كيف الربيع WebMVC يعمل.هناك الكثير لا يمكن السيطرة عليها السحر بالنسبة لي.(و مع @EnableAutoConfiguration هناك المزيد من السحر قدم.جيد لسهولة النماذج الصعب الحفاظ عليها).
هذا هو كيف يتم تكوين webapp:
public class SpringWebBooter implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigApplicationContext rootContext = new AnnotationConfigApplicationContext();
rootContext.register(SpringConfiguration.class); //main configuration class for all beans
rootContext.refresh();
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.setParent(rootContext);
ctx.register(SpringWebConfiguration.class); //web context configuration class
ServletRegistration.Dynamic api = servletContext.addServlet("api", new DispatcherServlet(ctx));
api.setLoadOnStartup(1);
api.addMapping("/api/*");
}
}
الآن أريد أن أضيف نوع المحولات و httpMessageConverters ، وذلك في SpringWebConfiguration فئة حاولت:
@EnableWebMvc
@Configuration
@ComponentScan
public class SpringWebConfiguration {
//works but feels very *magic*
@Autowired
public void configureConversionService(FormattingConversionService conversionService) {
conversionService.addConverter(new PointConverter(GEOMETRY_FACTORY));
conversionService.addConverterFactory(new StringToEnumConverterFactory());
}
//not working yet
@Bean
public MappingJackson2HttpMessageConverter createJsonMessageConverter() {
ObjectMapper o = new ObjectMapper();
o.enable(SerializationFeature.INDENT_OUTPUT);
MappingJackson2HttpMessageConverter c = new MappingJackson2HttpMessageConverter();
c.setObjectMapper(o);
return c;
}
}
ماذا سنجد بديهية هو إضافة نوع الرسالة محولات عندما كنت بناء المرسل بريمج.التي من شأنها أن تكون أكثر وضوحا بكثير من بعض مشكوك فيها autowiring أو الفول الخلق.أنا دائما "الأمل" في أن المرسل بريمج داخليا صورة بلدي الفول ، ولكن غالبا ما يكون مجرد التجربة والخطأ. هل من الممكن انشاء الربيع Mvc في directer الطريقة?مع أقل السحر ملموسة أكثر التجسيدات و #addHttpMessageConverter(...) يدعو على سبيل المثال ؟
نفس الأساس بالنسبة ExceptionResolvers, RequestHandler و RequestAdapter.
يناير
المحلول
الطريقة الأكثر مباشرة سيكون تمديد WebMvcConfigurationSupport
.يمكنك إعداد كل شيء تقريبا من هذا الطريق عن طريق تجاوز الأساليب.
ولكن أن تكون على علم أنه هو مباشر جدا طريقة الإعداد الأشياء.فهو يوفر لك المزيد من التحكم من الآن أو حتى WebMvcConfigurerAdapter
من شأنها أن تعطي لك.من مستندات:
If the customization options of {@link WebMvcConfigurer} do not expose
something you need to configure, consider removing the {@code @EnableWebMvc}
annotation and extending directly from {@link WebMvcConfigurationSupport}
overriding selected {@code @Bean} methods
مخصص (أو حسب الطلب) رسالة المحولات يمكن أن تضاف عن طريق تجاوز configureMessageConverters
.
نصائح أخرى
إذا كنت تمديد WebMvcConfigurerAdapter الويب الخاص بك التكوين ، فإنه ينبغي أن يشعر أقل قليلا من السحر و أيضا تعطيك هوك لتكوين رسالة محولات فضلا عن عدد من المكونات الأخرى.
@Configuration
@ComponentScan
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter
{
@Autowired
private CustomObjectMapper domainMapper;
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
{
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(domainMapper);
converters.add(converter);
super.configureMessageConverters(converters);
}
}