2016-06-15 83 views
0

我有一个只需将消息发送到kafka主题的spring启动应用程序。代码看起来像这样。没有发现依赖关系的[com.comcast.activation.message.interfaces.MessageChannels]类型的合格bean:

@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"); 
} 
} 

此应用程序运行正常作为独立的应用程序。当我创建一个罐子出来,并将其包含到另一个春季启动应用程序,以便我可以使用生产者发送消息到主题并运行春季启动应用程序我得到以下异常:

无法实例化SpringCLoudStreamClient。,reason

:找不到符合条件的[com.comcast.activation.message.interfaces.MessageChannels]类型的符合条件的bean:期望至少1个符合此依赖关系自动装配候选资格的bean。

我得到了下面的一行代码

@Autowired SpringCloudStreamClient producer; 

我已经使用组件扫描,以确保在JAR包由父春天启动的应用程序扫描上面的异常。这样做后,我得到了上述例外。启用绑定注释并没有做它应该做的事情,那就是在这个场景中创建一个消息通道接口的实现。这是一个错误还是我错过了什么?

+0

你是怎么制作罐子的?你的依赖是什么? – Ulises

+0

执行gradle build会生成一个弹簧启动应用程序的jar。 –

回答

0

一般来说,@EnableBinding(MessageChannels.class)属于不是bean的配置(它使用@Configuration进行元注释)。它似乎并没有被第二个应用程序识别出来,它不会触发代理生成过程。尽管如此,我仍然看到它是作为一个bean生成的,由@Service注释触发。一个简单的方法是在你的父应用程序中执行@Import(SpringCloudStreamClient.class),虽然组件扫描应该将它带入。

你的父配置怎么样?

相关问题