在Spring boot

时间:2016-10-17 08:27:57

标签: spring spring-mvc spring-boot

我正在尝试从spring-cloud-aws-messaging实例化一个解析器,特别是NotificationMessageArgumentResolver。问题是它需要MessageConvertor作为参数。所以,这就是我到目前为止所做的:

private NotificationMessageArgumentResolver notificationMessageArgumentResolver() {
    new NotificationMessageArgumentResolver(this.messageConvertor);
}

要获得messageConvertor,我尝试过:

@Autowired
public MvcConfig(MessageConvertor messageConvertor) {}

@Autowired
public MvcConfig(MappingJackson2MessageConverter messageConvertor) {}

但是我以no bean found的方式得到同样的错误。文档只是要求使用XML:

<mvc:annotation-driven>
<mvc:argument-resolvers>
    <ref bean="notificationResolver" />
</mvc:argument-resolvers>

<aws-messaging:notification-argument-resolver id="notificationResolver" />

根据文件

  

注册三个参数解析器:NotificationStatusHandlerMethodArgumentResolverNotificationMessageHandlerMethodArgumentResolverNotificationSubjectHandlerMethodArgumentResolver

所以,根据How to use argument-resolvers using annotation in Spring boot?的回答,我可以添加3个bean中的2个,因为他们不需要任何我无法访问的bean,但是我无法实例化{{ 1}}由于缺少NotificationMessageArgumentResolver。我希望我的所有消息都纯粹是用JSON编写的,所以我确切地知道要使用哪个MessageConvertor,这是Spring Boot附带的JSON的默认消息。

修改

整个文件,如果有人感兴趣:http://pastebin.com/tM471AEv

1 个答案:

答案 0 :(得分:1)

我想知道你是否真的需要NotificationMessageArgumentResolver,因为它是在使用消息时使用的。如您所见,它实现了HandlerMethodArgumentResolver包中的org.springframework.messaging

我怀疑您想要使用NotificationMessageHandlerMethodArgumentResolver。哪个是HandlerMethodArgumentResolver用于Web而不是消息传递。使用<aws-messaging:notification-argument-resolver id="notificationResolver" />

时也会注册

我还建议使用NotificationHandlerMethodArgumentResolverFactoryBean而不是3个单独的bean,因为它也是命名空间和注释驱动配置在内部使用的类。

您的配置看起来像这样。

@Bean
public NotificationHandlerMethodArgumentResolverFactoryBean notificationHandlerMethodArgumentResolverFactoryBean() {
    return new NotificationHandlerMethodArgumentResolverFactoryBean();
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(notificationHandlerMethodArgumentResolverFactoryBean.getObject());
}