我有一个spring-boot应用程序,它只向kafka主题发送消息。代码如下所示。
@RestController
@RequestMapping("/ActivationQueueService")
public class ActivationQueueController {
private static final Logger LOGGER = LoggerFactory
.getLogger(ActivationQueueController.class);
@Autowired
SpringCloudStreamClient producer;
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new ActivationDataInfoValidator());
}
@RequestMapping(method = RequestMethod.POST, value = "/sendMessage", headers = "Accept=application/json", produces = "application/json")
public void sendMessage(@RequestBody ActivationDataInfo message)
throws JsonProcessingException {
LOGGER.debug("Activation Data Request Recieved : " + message.toString());
if (message != null) {
ObjectMapper mapper = new ObjectMapper();
producer.sendMessagetoKafka(message);
LOGGER.info("Activation Data Request sent to Kafka : " + message);
}
}
}
接口:
public interface MessageChannels {
@Output("activationMsgQueue")
MessageChannel save();
}
制作人:
@Service
@EnableBinding(MessageChannels.class)
public class SpringCloudStreamClient {
private static final Logger LOGGER = LoggerFactory
.getLogger(SpringCloudStreamClient.class);
@Autowired MessageChannels msgChannel;
public Object sendMessagetoKafka(ActivationDataInfo msg){
LOGGER.info("Sending Message : " + msg);
msgChannel.save().send(MessageBuilder.withPayload(msg).build());
return new String("Success");
}
}
此应用程序作为独立应用程序运行良好。当我用这个创建一个jar并将其包含到另一个spring boot应用程序中,以便使用producer向topic发送消息并运行spring boot应用程序时,我得到以下异常:
无法示例化springcloudstreamclient.,原因是
:找不到[com.comcast.activation.message.interfaces.messagechannels]类型的符合条件的bean作为依赖项:至少需要1个符合此依赖项的autowire候选bean。
我得到上面的例外为下面的代码行
@Autowired SpringCloudStreamClient producer;
我使用组件扫描来确保jar中的包被父spring引导应用程序扫描。在这样做之后,我得到了上面的异常。enable binding annotation没有执行它应该执行的操作,即在此场景中创建消息通道接口的实现。这是虫子还是我遗漏了什么?
1条答案
按热度按时间mkh04yzy1#
一般来说,
@EnableBinding(MessageChannels.class)
属于配置而不是bean(它是用@Configuration
). 您的第二个应用程序似乎无法识别它,这不会触发代理生成过程。不过,我仍然看到它是作为bean生成的,由@Service
注解。一个简单的方法就是做一个@Import(SpringCloudStreamClient.class)
在父应用程序中,尽管组件扫描应该将其引入。你父母的配置怎么样?