我可以在spring中使用带有java注释的xml wire

时间:2014-11-26 13:48:44

标签: spring

我有一类GenerateKey,用于spring mvc boot。由于它需要联系数据库和消息队列,所以我尝试使用xml

连接它
@RestController
public class GenerateKey {
    final private DriverManagerDataSource dataSource;
    final private AmqpTemplate rabbitMQTemplate;
    final private String queueName;
    public GenerateKey(DriverManagerDataSource dataSource,AmqpTemplate rabbitMQTemplate,String queueName){
        this.dataSource=dataSource;
        this.rabbitMQTemplate =rabbitMQTemplate;
        this.queueName =queueName;
    }
    @RequestMapping("/key/generate")
    public String generateKey(@RequestParam(value = "businesskey") String businesskey, @RequestParam(value = "customer") String customer, Model model) {
        JdbcTemplate jdbctemplate = new JdbcTemplate(dataSource);
        JSONObject obj = new JSONObject();
        obj.put("businesskey", businesskey);
        obj.put("customer", customer);
        rabbitMQTemplate.convertAndSend(queueName, obj.toString());
        System.out.println(businesskey+customer);
        return "greeting" + businesskey + customer;
    }
}

xml配置如下所示并使用  @ImportResource( { "rabbit-listener-context.xml" } ) 导入它

 <bean id="request" class="com.testcom.keyservice.GenerateKey" c:dataSource-ref="dataSource" c:rabbitMQTemplate-ref="keyRequestTemplate" c:queueName="${keyRequestQueueName}"/>

但它抱怨“找不到默认构造函数”如下:

2014-11-26 21:42:16.095  INFO 17400 --- [           main] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report enabled debug logging (start with --debug)


2014-11-26 21:42:16.097 ERROR 17400 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'generateKey' defined in file [/home/oracle/NetBeansProjects/rabbitmq-native/keyService/build/classes/main/com/testcom/keyservice/GenerateKey.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.testcom.keyservice.GenerateKey]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.testcom.keyservice.GenerateKey.<init>()
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1040)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:725)
Exception in thread "main"  at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicatixt.java:482)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)

1 个答案:

答案 0 :(得分:1)

由于您使用的是Spring Boot,我假设您的应用程序中还有@ComponentScan个活动状态。因此,您创建了两个GenerateKey类的实例 - 一次是因为@RestController注释,第二次是XML。我相信这不是你想要达到的目标。

删除代表request类的GeneratorKey bean的XML声明,并仅使用基于Java的自动装配。

@RestController
public class GenerateKey {
    private final DriverManagerDataSource dataSource;
    private final AmqpTemplate rabbitMQTemplate;
    private final String queueName;

    @Autowired
    public GenerateKey(@Qualifier("dataSource") DriverManagerDataSource dataSource, @Qualifier("keyRequestTemplate") AmqpTemplate rabbitMQTemplate, @Value("${keyRequestQueueName}") String queueName) {
        this.dataSource=dataSource;
        this.rabbitMQTemplate =rabbitMQTemplate;
        this.queueName =queueName;
    }