@Test public void overrideArgumentResolvers() throws Exception { DefaultMessageHandlerMethodFactory instance = createInstance(); List<HandlerMethodArgumentResolver> customResolvers = new ArrayList<>(); customResolvers.add(new CustomHandlerMethodArgumentResolver()); instance.setArgumentResolvers(customResolvers); instance.afterPropertiesSet(); Message<String> message = MessageBuilder.withPayload("sample").build(); // This will work as the local resolver is set InvocableHandlerMethod invocableHandlerMethod = createInvocableHandlerMethod(instance, "customArgumentResolver", Locale.class); invocableHandlerMethod.invoke(message); assertMethodInvocation(sample, "customArgumentResolver"); // This won't work as no resolver is known for the payload InvocableHandlerMethod invocableHandlerMethod2 = createInvocableHandlerMethod(instance, "simpleString", String.class); thrown.expect(MethodArgumentResolutionException.class); thrown.expectMessage("No suitable resolver"); invocableHandlerMethod2.invoke(message); }
@Bean(IntegrationContextUtils.MESSAGE_HANDLER_FACTORY_BEAN_NAME) public MessageHandlerMethodFactory messageHandlerMethodFactory() { DefaultMessageHandlerMethodFactory f = new DefaultMessageHandlerMethodFactory(); HandlerMethodArgumentResolver resolver = new HandlerMethodArgumentResolver() { @Override public boolean supportsParameter(MethodParameter parameter) { return true; } @Override public Object resolveArgument(MethodParameter parameter, Message<?> message) { String[] names = ((String) message.getPayload()).split(" "); return new Person(names[0], names[1]); } }; f.setArgumentResolvers(Collections.singletonList(resolver)); f.afterPropertiesSet(); return f; }
messageHandlerMethodFactory.setArgumentResolvers(resolvers); messageHandlerMethodFactory.setValidator(validator); return messageHandlerMethodFactory;