Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在spring中将xml wire与java注释一起使用吗_Spring - Fatal编程技术网

我可以在spring中将xml wire与java注释一起使用吗

我可以在spring中将xml wire与java注释一起使用吗,spring,Spring,我有一个GenerateKey类,用于SpringMVC引导。因为它需要联系数据库和消息队列,所以我尝试使用xml连接它 @RestController public class GenerateKey { final private DriverManagerDataSource dataSource; final private AmqpTemplate rabbitMQTemplate; final private String queueName; pub

我有一个GenerateKey类,用于SpringMVC引导。因为它需要联系数据库和消息队列,所以我尝试使用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)
2014-11-26 21:42:16.095信息17400---[main]自动配置报告日志初始化器:
启动ApplicationContext时出错。显示启用调试日志的自动配置报告(从--debug开始)
2014-11-26 21:42:16.097错误17400---[main]o.s.boot.SpringApplication:应用程序启动失败
org.springframework.beans.factory.BeanCreationException:创建名为“generateKey”的bean时出错,该名称在文件[/home/oracle/NetBeansProjects/rabbitmq native/keyService/build/classes/main/com/testcom/keyService/generateKey.class]中定义:bean实例化失败;嵌套异常为org.springframework.beans.BeanInstantiationException:无法实例化bean类[com.testcom.keyservice.GenerateKey]:未找到默认构造函数;嵌套异常是java.lang.NoSuchMethodException:com.testcom.keyservice.GenerateKey。()
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.InstanceBean(AbstractAutowireCapableBeanFactory.java:1095)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1040)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:505)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:725)
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762)处的线程“main”中出现异常
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationText.java:482)
位于org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
位于org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
位于org.springframework.boot.SpringApplication.run(SpringApplication.java:320)

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

摆脱表示
GeneratorKey
类的
request
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;
    }

没有默认构造函数,并且没有使用
@Autowired
注释您拥有的构造函数。主要的问题是,您有XML配置和一个
@RestController
,这会导致bean的两个实例,为什么您需要XML实例,就让它被检测吧。我知道你的类首先是有缺陷的,不要依赖于
drivermanagedatasource
,而是
DataSource
,不要每次需要时构造一个
jdbc模板
,只要构造一次就可以了。或者更好地使用spring boot创建的一个,然后注入它(而不是数据源和构造yuor own.@M.Deinum,这是一个很好的建议。但是如何只构造一次JdbcTemplate?每次向GenerateKey发出URLrequest时,是否会创建一个新实例,以便JdbcTemplate多次初始化?如果是,如何保留一个实例?如果spring为每个URLrequest重用相同的GenerateKey实例,那么只初始化一个JdbcTemplate。
JdbcTemplate
是一个很难构建的对象,因为它检测数据库类型并尝试构建其他一些东西。构建后它是线程安全的,所以只需重用它。您的
GenerateKey
类只有一个实例(目前实际上有两个)但是bean的作用域是单实例的,因此每个请求都没有新实例。M.Deinum还评论说“不要每次需要一个JdbcTemplate时都构造一个JdbcTemplate,只构造一次并保留它。或者更好地使用spring boot创建的JdbcTemplate并注入它(而不是数据源并构造自己的JdbcTemplate)。”,您的方法是否使用SpringBoot创建的方法并将其注入(而不是数据源和自己的?对不起,我是spring的新手。我的回答只说明如何正确实例化bean和autowire依赖项。@m-deinum完全正确-您的代码还有更多问题。我建议您熟悉spring引导参考和许多spring指南。祝您好运,并从Spri中获得乐趣ng!