@Test(expected = TypeMismatchException.class) public void testCustomConversionService() throws Exception { loadBeanDefinitions("mvc-config-custom-conversion-service.xml", 14); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); mapping.setDefaultHandler(handlerMethod); // default web binding initializer behavior test MockHttpServletRequest request = new MockHttpServletRequest("GET", "/"); request.setRequestURI("/accounts/12345"); request.addParameter("date", "2009-10-31"); MockHttpServletResponse response = new MockHttpServletResponse(); HandlerExecutionChain chain = mapping.getHandler(request); assertEquals(1, chain.getInterceptors().length); assertTrue(chain.getInterceptors()[0] instanceof ConversionServiceExposingInterceptor); ConversionServiceExposingInterceptor interceptor = (ConversionServiceExposingInterceptor) chain.getInterceptors()[0]; interceptor.preHandle(request, response, handler); assertSame(appContext.getBean("conversionService"), request.getAttribute(ConversionService.class.getName())); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); adapter.handle(request, response, handlerMethod); }
@Override public void afterPropertiesSet() throws Exception { RequestMappingHandlerAdapter requestMappingHandlerAdapter = this.beanFactory.getBean(RequestMappingHandlerAdapter.class); List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>(); List<HandlerMethodReturnValueHandler> returnValueHandlers = new ArrayList<>(); if (beanFactory instanceof ConfigurableBeanFactory) { argumentResolvers.add(new WxArgumentResolver((ConfigurableBeanFactory) beanFactory)); } else { argumentResolvers.add(new WxArgumentResolver(beanFactory.getBean(WxUserManager.class), beanFactory.getBean(WxUserProvider.class))); } returnValueHandlers.add(beanFactory.getBean(WxAsyncMessageReturnValueHandler.class)); argumentResolvers.addAll(requestMappingHandlerAdapter.getArgumentResolvers()); returnValueHandlers.addAll(requestMappingHandlerAdapter.getReturnValueHandlers()); requestMappingHandlerAdapter.setArgumentResolvers(argumentResolvers); requestMappingHandlerAdapter.setReturnValueHandlers(returnValueHandlers); }
private void doTestCustomValidator(String xml) throws Exception { loadBeanDefinitions(xml, 14); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); assertFalse(mapping.getUrlPathHelper().shouldRemoveSemicolonContent()); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); assertEquals(true, new DirectFieldAccessor(adapter).getPropertyValue("ignoreDefaultModelOnRedirect")); // default web binding initializer behavior test MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter("date", "2009-10-31"); MockHttpServletResponse response = new MockHttpServletResponse(); adapter.handle(request, response, handlerMethod); assertTrue(appContext.getBean(TestValidator.class).validatorInvoked); assertFalse(handler.recordedValidationError); }
@Test public void testAsyncSupportOptions() throws Exception { loadBeanDefinitions("mvc-config-async-support.xml", 15); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(adapter); assertEquals(ConcurrentTaskExecutor.class, fieldAccessor.getPropertyValue("taskExecutor").getClass()); assertEquals(2500L, fieldAccessor.getPropertyValue("asyncRequestTimeout")); CallableProcessingInterceptor[] callableInterceptors = (CallableProcessingInterceptor[]) fieldAccessor.getPropertyValue("callableInterceptors"); assertEquals(1, callableInterceptors.length); DeferredResultProcessingInterceptor[] deferredResultInterceptors = (DeferredResultProcessingInterceptor[]) fieldAccessor.getPropertyValue("deferredResultInterceptors"); assertEquals(1, deferredResultInterceptors.length); }
@Test public void requestMappingHandlerAdapter() throws Exception { delegatingConfig.setConfigurers(Arrays.asList(webMvcConfigurer)); RequestMappingHandlerAdapter adapter = delegatingConfig.requestMappingHandlerAdapter(); ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer(); ConversionService initializerConversionService = initializer.getConversionService(); assertTrue(initializer.getValidator() instanceof LocalValidatorFactoryBean); verify(webMvcConfigurer).configureMessageConverters(converters.capture()); verify(webMvcConfigurer).configureContentNegotiation(contentNegotiationConfigurer.capture()); verify(webMvcConfigurer).addFormatters(conversionService.capture()); verify(webMvcConfigurer).addArgumentResolvers(resolvers.capture()); verify(webMvcConfigurer).addReturnValueHandlers(handlers.capture()); verify(webMvcConfigurer).configureAsyncSupport(asyncConfigurer.capture()); assertSame(conversionService.getValue(), initializerConversionService); assertEquals(0, resolvers.getValue().size()); assertEquals(0, handlers.getValue().size()); assertEquals(converters.getValue(), adapter.getMessageConverters()); assertNotNull(asyncConfigurer); }
@SuppressWarnings("unchecked") @Test public void testArgumentResolvers() { loadBeanDefinitions("mvc-config-argument-resolvers.xml"); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); Object value = new DirectFieldAccessor(adapter).getPropertyValue("customArgumentResolvers"); assertNotNull(value); assertTrue(value instanceof List); List<HandlerMethodArgumentResolver> resolvers = (List<HandlerMethodArgumentResolver>) value; assertEquals(3, resolvers.size()); assertTrue(resolvers.get(0) instanceof ServletWebArgumentResolverAdapter); assertTrue(resolvers.get(1) instanceof TestHandlerMethodArgumentResolver); assertTrue(resolvers.get(2) instanceof TestHandlerMethodArgumentResolver); assertNotSame(resolvers.get(1), resolvers.get(2)); }
private void rebuildMessageConverter(RequestMappingHandlerAdapter adapter) { List<HttpMessageConverter<?>> messageConverters = adapter.getMessageConverters(); if (!CollectionUtils.isEmpty(messageConverters)) { for (HttpMessageConverter<?> messageConverter : messageConverters) { if (messageConverter instanceof MappingJackson2HttpMessageConverter) { rebuildJacksonV2((MappingJackson2HttpMessageConverter) messageConverter); } // if (messageConverter instanceof MappingJacksonHttpMessageConverter) { // rebuildJacksonV1((MappingJacksonHttpMessageConverter) messageConverter); // } } } /** * 处理form表单 * form表单通过get方法请求,controller里边的方法中只需设置一个接收的对象即可. */ adapter.getMessageConverters().add(new FormHttpMessageConverter()); }
@SuppressWarnings("unchecked") private HttpMessageConverter<Object> findConverter( Class<? extends HttpMessageConverter<?>> selectedConverterType, MediaType mediaType) { HttpMessageConverter<Object> cached = (HttpMessageConverter<Object>) this.converterCache .get(mediaType); if (cached != null) { return cached; } for (RequestMappingHandlerAdapter handlerAdapter : this.handlerAdapters) { for (HttpMessageConverter<?> converter : handlerAdapter .getMessageConverters()) { if (selectedConverterType.isAssignableFrom(converter.getClass()) && converter.canWrite(EndpointResource.class, mediaType)) { this.converterCache.put(mediaType, converter); return (HttpMessageConverter<Object>) converter; } } } return null; }
@PostConstruct public void customizedSupportedMediaTypes() { if (this.beanFactory instanceof ListableBeanFactory) { Map<String, RequestMappingHandlerAdapter> handlerAdapters = ((ListableBeanFactory) this.beanFactory) .getBeansOfType(RequestMappingHandlerAdapter.class); for (Entry<String, RequestMappingHandlerAdapter> entry : handlerAdapters .entrySet()) { RequestMappingHandlerAdapter handlerAdapter = entry.getValue(); for (HttpMessageConverter<?> converter : handlerAdapter .getMessageConverters()) { if (converter instanceof TypeConstrainedMappingJackson2HttpMessageConverter) { ((TypeConstrainedMappingJackson2HttpMessageConverter) converter) .setSupportedMediaTypes( Arrays.asList(MediaTypes.HAL_JSON, MediaType.APPLICATION_JSON)); } } } } }
@Test public void customizationOfSupportedMediaTypesCanBeDisabled() { this.context = new AnnotationConfigWebApplicationContext(); this.context.setServletContext(new MockServletContext()); this.context.register(BaseConfig.class); EnvironmentTestUtils.addEnvironment(this.context, "spring.hateoas.use-hal-as-default-json-media-type:false"); this.context.refresh(); RequestMappingHandlerAdapter handlerAdapter = this.context .getBean(RequestMappingHandlerAdapter.class); for (HttpMessageConverter<?> converter : handlerAdapter.getMessageConverters()) { if (converter instanceof TypeConstrainedMappingJackson2HttpMessageConverter) { assertThat(converter.getSupportedMediaTypes()) .containsExactly(MediaTypes.HAL_JSON); } } }
@Bean public WebMvcRegistrations webMvcRegistrations() { return new WebMvcRegistrationsAdapter() { @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { DefaultRequestMappingHandlerMapping mapping = new DefaultRequestMappingHandlerMapping(); mapping.setControllerPostfix("Controller"); mapping.setExcludePatterns(new String[]{ "/js/**", "/css/**", "/imgs/**" }); return mapping; } @Override public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() { DefaultRequestMappingHandlerAdapter adapter = new DefaultRequestMappingHandlerAdapter(); adapter.setAutoView(true); return adapter; } }; }
@SuppressWarnings("unchecked") private HttpMessageConverter<Object> findConverter( Class<? extends HttpMessageConverter<?>> selectedConverterType, MediaType mediaType) { if (this.converterCache.containsKey(mediaType)) { return (HttpMessageConverter<Object>) this.converterCache.get(mediaType); } for (RequestMappingHandlerAdapter handlerAdapter : this.handlerAdapters) { for (HttpMessageConverter<?> converter : handlerAdapter .getMessageConverters()) { if (selectedConverterType.isAssignableFrom(converter.getClass()) && converter.canWrite(EndpointResource.class, mediaType)) { this.converterCache.put(mediaType, converter); return (HttpMessageConverter<Object>) converter; } } } return null; }
@Bean public SmartInitializingSingleton fluxRequestMappingHandlerAdapterProcessor( RequestMappingHandlerAdapter adapter, FluxHandlerMethodArgumentResolver resolver) { return new SmartInitializingSingleton() { @Override public void afterSingletonsInstantiated() { List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>( adapter.getArgumentResolvers()); resolvers.add(0, resolver); adapter.setArgumentResolvers(resolvers); if (!ClassUtils.isPresent("org.springframework.core.ReactiveAdapter", null)) { List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>( adapter.getReturnValueHandlers()); handlers.add(0, context.getBean(FluxReturnValueHandler.class)); adapter.setReturnValueHandlers(handlers); } } }; }
@Override public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ContextRefreshedEvent) { ApplicationContext applicationContext = ((ContextRefreshedEvent) event).getApplicationContext(); RequestMappingHandlerAdapter adapter = applicationContext.getBean(RequestMappingHandlerAdapter.class); TeapotMappingHandler handler = new TeapotMappingHandler( mapper, getMessageConverters()); List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>(); argumentResolvers.add(handler); argumentResolvers.addAll(adapter.getArgumentResolvers()); adapter.setArgumentResolvers(argumentResolvers); List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(); handlers.add(handler); // must be first handlers.addAll(adapter.getReturnValueHandlers()); adapter.setReturnValueHandlers(handlers); } }
@Test public void customizationOfSupportedMediaTypesCanBeDisabled() { this.context = new AnnotationConfigWebApplicationContext(); this.context.setServletContext(new MockServletContext()); this.context.register(BaseConfig.class); EnvironmentTestUtils.addEnvironment(this.context, "spring.hateoas.use-hal-as-default-json-media-type:false"); this.context.refresh(); RequestMappingHandlerAdapter handlerAdapter = this.context .getBean(RequestMappingHandlerAdapter.class); for (HttpMessageConverter<?> converter : handlerAdapter.getMessageConverters()) { if (converter instanceof TypeConstrainedMappingJackson2HttpMessageConverter) { assertThat(converter.getSupportedMediaTypes(), contains(MediaTypes.HAL_JSON)); } } }
@Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof RequestMappingHandlerAdapter) { RequestMappingHandlerAdapter adapter = (RequestMappingHandlerAdapter) bean; List<HandlerMethodArgumentResolver> resolvers = new LinkedList<>(); resolvers.addAll(adapter.getArgumentResolvers()); resolvers.replaceAll(handlerMethodArgumentResolver -> { if (handlerMethodArgumentResolver instanceof ServletModelAttributeMethodProcessor) { return new FormModelAttributeMethodProcessor(false); } return handlerMethodArgumentResolver; }); adapter.setArgumentResolvers(resolvers); } return bean; }
public MockMvc mvc(Object controller) { StandaloneMockMvcBuilder builder = new StandaloneMockMvcBuilder(controller) { @Override protected WebApplicationContext initWebAppContext() { WebApplicationContext context = super.initWebAppContext(); StaticListableBeanFactory beanFactory = (StaticListableBeanFactory)context.getAutowireCapableBeanFactory(); Arrays.stream(BeanFactoryUtils.beanNamesForTypeIncludingAncestors(applicationContext, Object.class)) .filter(name -> applicationContext.findAnnotationOnBean(name, ControllerAdvice.class) != null) .forEach(name -> beanFactory.addBean(name, applicationContext.getBean(name))); context.getBean(RequestMappingHandlerAdapter.class).afterPropertiesSet(); return context; } }; return builder.setHandlerExceptionResolvers(handlerExceptionResolver).build(); }
private void registerMvcSingletons(StubWebApplicationContext cxt) { StandaloneConfiguration configuration = new StandaloneConfiguration(); RequestMappingHandlerMapping handlerMapping = configuration.requestMappingHandlerMapping(); handlerMapping.setServletContext(cxt.getServletContext()); handlerMapping.setApplicationContext(cxt); cxt.addBean("requestMappingHandlerMapping", handlerMapping); RequestMappingHandlerAdapter handlerAdapter = configuration.requestMappingHandlerAdapter(); handlerAdapter.setServletContext(cxt.getServletContext()); handlerAdapter.setApplicationContext(cxt); handlerAdapter.afterPropertiesSet(); cxt.addBean("requestMappingHandlerAdapter", handlerAdapter); cxt.addBean("handlerExceptionResolver", configuration.handlerExceptionResolver()); cxt.addBeans(initViewResolvers(cxt)); cxt.addBean(DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME, this.localeResolver); cxt.addBean(DispatcherServlet.THEME_RESOLVER_BEAN_NAME, new FixedThemeResolver()); cxt.addBean(DispatcherServlet.REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME, new DefaultRequestToViewNameTranslator()); this.flashMapManager = new SessionFlashMapManager(); cxt.addBean(DispatcherServlet.FLASH_MAP_MANAGER_BEAN_NAME, this.flashMapManager); }
@Test(expected=TypeMismatchException.class) public void testCustomConversionService() throws Exception { loadBeanDefinitions("mvc-config-custom-conversion-service.xml", 12); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); mapping.setDefaultHandler(handlerMethod); // default web binding initializer behavior test MockHttpServletRequest request = new MockHttpServletRequest("GET", "/"); request.setRequestURI("/accounts/12345"); request.addParameter("date", "2009-10-31"); MockHttpServletResponse response = new MockHttpServletResponse(); HandlerExecutionChain chain = mapping.getHandler(request); assertEquals(1, chain.getInterceptors().length); assertTrue(chain.getInterceptors()[0] instanceof ConversionServiceExposingInterceptor); ConversionServiceExposingInterceptor interceptor = (ConversionServiceExposingInterceptor) chain.getInterceptors()[0]; interceptor.preHandle(request, response, handler); assertSame(appContext.getBean("conversionService"), request.getAttribute(ConversionService.class.getName())); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); adapter.handle(request, response, handlerMethod); }
@Test public void testCustomValidator() throws Exception { loadBeanDefinitions("mvc-config-custom-validator.xml", 12); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); assertFalse(mapping.getUrlPathHelper().shouldRemoveSemicolonContent()); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); assertEquals(true, new DirectFieldAccessor(adapter).getPropertyValue("ignoreDefaultModelOnRedirect")); // default web binding initializer behavior test MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter("date", "2009-10-31"); MockHttpServletResponse response = new MockHttpServletResponse(); adapter.handle(request, response, handlerMethod); assertTrue(appContext.getBean(TestValidator.class).validatorInvoked); assertFalse(handler.recordedValidationError); }
@Test public void testAsyncSupportOptions() throws Exception { loadBeanDefinitions("mvc-config-async-support.xml", 13); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(adapter); assertEquals(ConcurrentTaskExecutor.class, fieldAccessor.getPropertyValue("taskExecutor").getClass()); assertEquals(2500L, fieldAccessor.getPropertyValue("asyncRequestTimeout")); CallableProcessingInterceptor[] callableInterceptors = (CallableProcessingInterceptor[]) fieldAccessor.getPropertyValue("callableInterceptors"); assertEquals(1, callableInterceptors.length); DeferredResultProcessingInterceptor[] deferredResultInterceptors = (DeferredResultProcessingInterceptor[]) fieldAccessor.getPropertyValue("deferredResultInterceptors"); assertEquals(1, deferredResultInterceptors.length); }
@Test public void requestMappingHandlerAdapter() throws Exception { RequestMappingHandlerAdapter adapter = mvcConfiguration.requestMappingHandlerAdapter(); List<HttpMessageConverter<?>> expectedConverters = new ArrayList<HttpMessageConverter<?>>(); mvcConfiguration.addDefaultHttpMessageConverters(expectedConverters); assertEquals(expectedConverters.size(), adapter.getMessageConverters().size()); ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer(); assertNotNull(initializer); ConversionService conversionService = initializer.getConversionService(); assertNotNull(conversionService); assertTrue(conversionService instanceof FormattingConversionService); Validator validator = initializer.getValidator(); assertNotNull(validator); assertTrue(validator instanceof LocalValidatorFactoryBean); }
@Override public void onApplicationEvent(ContextRefreshedEvent event) { RequestMappingHandlerAdapter adapter = event.getApplicationContext().getBean(RequestMappingHandlerAdapter.class); try { FacadeBuilderHandlerMethodArgumentResolver facadeBuilderHandlerMethodArgumentResolver = event.getApplicationContext().getBean(FacadeBuilderHandlerMethodArgumentResolver.class); List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>(adapter.getArgumentResolvers()); List<HandlerMethodArgumentResolver> customResolvers = adapter.getCustomArgumentResolvers(); argumentResolvers.remove(facadeBuilderHandlerMethodArgumentResolver); argumentResolvers.add(0, facadeBuilderHandlerMethodArgumentResolver); adapter.setArgumentResolvers(argumentResolvers); } catch (BeansException e) { //e.printStackTrace(); } }
@Test public void enableSns_withMinimalConfig_shouldConfigureACompositeArgumentResolver() throws Exception { // Arrange & Act this.webApplicationContext.register(MinimalSnsConfiguration.class); this.webApplicationContext.refresh(); RequestMappingHandlerAdapter requestMappingHandlerAdapter = this.webApplicationContext.getBean(RequestMappingHandlerAdapter.class); // Assert assertEquals(1, requestMappingHandlerAdapter.getCustomArgumentResolvers().size()); HandlerMethodArgumentResolver argumentResolver = requestMappingHandlerAdapter.getCustomArgumentResolvers().get(0); assertTrue(HandlerMethodArgumentResolverComposite.class.isInstance(argumentResolver)); HandlerMethodArgumentResolverComposite compositeArgumentResolver = (HandlerMethodArgumentResolverComposite) argumentResolver; assertEquals(3, compositeArgumentResolver.getResolvers().size()); assertNotNull(ReflectionTestUtils.getField(getNotificationStatusHandlerMethodArgumentResolver(compositeArgumentResolver.getResolvers()), "amazonSns")); }
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof RequestMappingHandlerAdapter) { RequestMappingHandlerAdapter adapter = (RequestMappingHandlerAdapter) bean; List<HttpMessageConverter<?>> converters = adapter.getMessageConverters(); for (HttpMessageConverter<?> converter : converters) { if (converter instanceof MappingJackson2HttpMessageConverter) { MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) converter; ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule("Alfresco MVC Module", new Version(1, 0, 0, null, null, null)); module.addSerializer(QName.class, new Jackson2QnameSerializer(serviceRegistry)); module.addDeserializer(QName.class, new Jackson2QnameDeserializer(serviceRegistry)); objectMapper.setDateFormat(new SimpleDateFormat(getDateFormat())); objectMapper.registerModule(module); jsonConverter.setObjectMapper(objectMapper); } } } return bean; }
@Override public Object postProcessBeforeInitialization(Object bean, String s) { if (bean instanceof RequestMappingHandlerAdapter) { ((RequestMappingHandlerAdapter) bean).getMessageConverters().stream() .filter(converter -> converter instanceof MappingJackson2HttpMessageConverter) .forEach(converter -> { MappingJackson2HttpMessageConverter halConverterCandidate = (MappingJackson2HttpMessageConverter) converter; ObjectMapper objectMapper = halConverterCandidate.getObjectMapper(); if (Jackson2HalModule.isAlreadyRegisteredIn(objectMapper)) { List<MediaType> vendorSpecificTypes = new ArrayList<>(halConverterCandidate.getSupportedMediaTypes()); vendorSpecificTypes.add(V1MediaType.V1_HAL_DOCUMENT_COLLECTION_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_HAL_DOCUMENT_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_HAL_FOLDER_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_HAL_DOCUMENT_CONTENT_VERSION_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_HAL_AUDIT_ENTRY_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_HAL_DOCUMENT_AND_METADATA_COLLECTION_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_DOCUMENT_COLLECTION_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_DOCUMENT_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_FOLDER_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_DOCUMENT_CONTENT_VERSION_MEDIA_TYPE); vendorSpecificTypes.add(V1MediaType.V1_AUDIT_ENTRY_MEDIA_TYPE); ((MappingJackson2HttpMessageConverter) converter).setSupportedMediaTypes(vendorSpecificTypes); } }); } return bean; }
public GuavaLFReturnValueHandler install(RequestMappingHandlerAdapter requestMappingHandlerAdapter) { final List<HandlerMethodReturnValueHandler> originalHandlers = new ArrayList<>( requestMappingHandlerAdapter.getReturnValueHandlers()); final int deferredPos = indexOfType(originalHandlers, DeferredResultMethodReturnValueHandler.class); // Add our handler directly after the deferred handler. originalHandlers.add(deferredPos + 1, this); requestMappingHandlerAdapter.setReturnValueHandlers(originalHandlers); return this; }
/** * Returns a {@link RequestMappingHandlerAdapter} for processing requests * through annotated controller methods. Consider overriding one of these * other more fine-grained methods: * <ul> * <li>{@link #addArgumentResolvers} for adding custom argument resolvers. * <li>{@link #addReturnValueHandlers} for adding custom return value handlers. * <li>{@link #configureMessageConverters} for adding custom message converters. * </ul> */ @Bean public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<HandlerMethodArgumentResolver>(); addArgumentResolvers(argumentResolvers); List<HandlerMethodReturnValueHandler> returnValueHandlers = new ArrayList<HandlerMethodReturnValueHandler>(); addReturnValueHandlers(returnValueHandlers); RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter(); adapter.setContentNegotiationManager(mvcContentNegotiationManager()); adapter.setMessageConverters(getMessageConverters()); adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer()); adapter.setCustomArgumentResolvers(argumentResolvers); adapter.setCustomReturnValueHandlers(returnValueHandlers); if (jackson2Present) { List<RequestBodyAdvice> requestBodyAdvices = new ArrayList<RequestBodyAdvice>(); requestBodyAdvices.add(new JsonViewRequestBodyAdvice()); adapter.setRequestBodyAdvice(requestBodyAdvices); List<ResponseBodyAdvice<?>> responseBodyAdvices = new ArrayList<ResponseBodyAdvice<?>>(); responseBodyAdvices.add(new JsonViewResponseBodyAdvice()); adapter.setResponseBodyAdvice(responseBodyAdvices); } AsyncSupportConfigurer configurer = new AsyncSupportConfigurer(); configureAsyncSupport(configurer); if (configurer.getTaskExecutor() != null) { adapter.setTaskExecutor(configurer.getTaskExecutor()); } if (configurer.getTimeout() != null) { adapter.setAsyncRequestTimeout(configurer.getTimeout()); } adapter.setCallableInterceptors(configurer.getCallableInterceptors()); adapter.setDeferredResultInterceptors(configurer.getDeferredResultInterceptors()); return adapter; }
@Test public void webBindingInitializer() throws Exception { RequestMappingHandlerAdapter adapter = this.config.requestMappingHandlerAdapter(); ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer(); assertNotNull(initializer); BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(null, ""); initializer.getValidator().validate(null, bindingResult); assertEquals("invalid", bindingResult.getAllErrors().get(0).getCode()); String[] codes = initializer.getMessageCodesResolver().resolveMessageCodes("invalid", null); assertEquals("custom.invalid", codes[0]); }
@Test public void requestMappingHandlerAdapter() throws Exception { ApplicationContext context = initContext(WebConfig.class); RequestMappingHandlerAdapter adapter = context.getBean(RequestMappingHandlerAdapter.class); List<HttpMessageConverter<?>> converters = adapter.getMessageConverters(); assertEquals(9, converters.size()); for(HttpMessageConverter<?> converter : converters) { if (converter instanceof AbstractJackson2HttpMessageConverter) { ObjectMapper objectMapper = ((AbstractJackson2HttpMessageConverter)converter).getObjectMapper(); assertFalse(objectMapper.getDeserializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)); assertFalse(objectMapper.getSerializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION)); assertFalse(objectMapper.getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)); if (converter instanceof MappingJackson2XmlHttpMessageConverter) { assertEquals(XmlMapper.class, objectMapper.getClass()); } } } ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) adapter.getWebBindingInitializer(); assertNotNull(initializer); ConversionService conversionService = initializer.getConversionService(); assertNotNull(conversionService); assertTrue(conversionService instanceof FormattingConversionService); Validator validator = initializer.getValidator(); assertNotNull(validator); assertTrue(validator instanceof LocalValidatorFactoryBean); DirectFieldAccessor fieldAccessor = new DirectFieldAccessor(adapter); @SuppressWarnings("unchecked") List<Object> bodyAdvice = (List<Object>) fieldAccessor.getPropertyValue("requestResponseBodyAdvice"); assertEquals(2, bodyAdvice.size()); assertEquals(JsonViewRequestBodyAdvice.class, bodyAdvice.get(0).getClass()); assertEquals(JsonViewResponseBodyAdvice.class, bodyAdvice.get(1).getClass()); }
@Test public void testMessageCodesResolver() { loadBeanDefinitions("mvc-config-message-codes-resolver.xml"); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); Object initializer = adapter.getWebBindingInitializer(); assertNotNull(initializer); MessageCodesResolver resolver = ((ConfigurableWebBindingInitializer) initializer).getMessageCodesResolver(); assertNotNull(resolver); assertEquals(TestMessageCodesResolver.class, resolver.getClass()); assertEquals(false, new DirectFieldAccessor(adapter).getPropertyValue("ignoreDefaultModelOnRedirect")); }
@Test public void testMessageConverters() { loadBeanDefinitions("mvc-config-message-converters.xml"); verifyMessageConverters(appContext.getBean(RequestMappingHandlerAdapter.class), true); verifyMessageConverters(appContext.getBean(ExceptionHandlerExceptionResolver.class), true); verifyRequestResponseBodyAdvice(appContext.getBean(RequestMappingHandlerAdapter.class)); verifyResponseBodyAdvice(appContext.getBean(ExceptionHandlerExceptionResolver.class)); }
@SuppressWarnings("unchecked") @Test public void testReturnValueHandlers() { loadBeanDefinitions("mvc-config-return-value-handlers.xml"); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); Object value = new DirectFieldAccessor(adapter).getPropertyValue("customReturnValueHandlers"); assertNotNull(value); assertTrue(value instanceof List); List<HandlerMethodReturnValueHandler> handlers = (List<HandlerMethodReturnValueHandler>) value; assertEquals(2, handlers.size()); assertEquals(TestHandlerMethodReturnValueHandler.class, handlers.get(0).getClass()); assertEquals(TestHandlerMethodReturnValueHandler.class, handlers.get(1).getClass()); assertNotSame(handlers.get(0), handlers.get(1)); }
private void registerMvcSingletons(StubWebApplicationContext wac) { StandaloneConfiguration config = new StandaloneConfiguration(); config.setApplicationContext(wac); wac.addBeans(this.controllerAdvice); StaticRequestMappingHandlerMapping hm = config.getHandlerMapping(); hm.setServletContext(wac.getServletContext()); hm.setApplicationContext(wac); hm.afterPropertiesSet(); hm.registerHandlers(this.controllers); wac.addBean("requestMappingHandlerMapping", hm); RequestMappingHandlerAdapter handlerAdapter = config.requestMappingHandlerAdapter(); handlerAdapter.setServletContext(wac.getServletContext()); handlerAdapter.setApplicationContext(wac); handlerAdapter.afterPropertiesSet(); wac.addBean("requestMappingHandlerAdapter", handlerAdapter); wac.addBean("handlerExceptionResolver", config.handlerExceptionResolver()); wac.addBeans(initViewResolvers(wac)); wac.addBean(DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME, this.localeResolver); wac.addBean(DispatcherServlet.THEME_RESOLVER_BEAN_NAME, new FixedThemeResolver()); wac.addBean(DispatcherServlet.REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME, new DefaultRequestToViewNameTranslator()); this.flashMapManager = new SessionFlashMapManager(); wac.addBean(DispatcherServlet.FLASH_MAP_MANAGER_BEAN_NAME, this.flashMapManager); }