Автопроводка не работает с @RestController

1

Мне нужно создать простой REST-сервис с некоторыми полями, которые я хочу экспортировать из файла applicationatonContext.xml, но у меня есть

Трассировки стека

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 's3RestController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.emc.sk.data_mgmt_central.server.S3RestController.path; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=path)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
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)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
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)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
at com.emc.sk.data_mgmt_central.main.Main.main(Main.java:39)

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.emc.sk.data_mgmt_central.server.S3RestController.path; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=path)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 16 common frames omitted

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=path)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1261)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1009)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:904)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:527)
... 18 common frames omitted

Я запускаю приложение с

Основной класс

@ComponentScan("com.emc.sk.data_mgmt_central.server")
@EnableAutoConfiguration
public class Main {
    public static void main(String[] args) {    
        SpringApplication.run(Main.class, args);   
    }
}

И вот мой

RestController

@RestController
@ContextConfiguration("/FileStorageContext.xml")
public class S3RestController {

@Autowired
private String path;

@RequestMapping("/getBucket")
public Bucket getBucket(@RequestParam(value="name", defaultValue="world") String name) {
    return new Bucket(name);
}   
}

Мой applicationContext называется FileStorageContext и хранится в src/main/recourses (у меня есть проект maven)

FileStorageContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans      http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean name = "path" class="java.lang.String">
    <constructor-arg type="java.lang.String" value="#{ systemProperties['java.io.tmpdir'] }bucketDir" />
</bean>

@Autowired работает правильно в моих тестах, но здесь эта ошибка возникает. Я новичок весной, может быть, эта конструкция не совсем правильная. Благодарю.

  • 0
    Обычно это означает, что вы неправильно импортируете свою конфигурацию. Это то, что было бы намного проще с JavaConfig или даже с @Value. .
Теги:
maven
spring
rest

3 ответа

1
Лучший ответ

Мне пришлось поставить @ImportResource ("classpath: /FileStorageContext.xml") перед моим основным классом, проблема в том, что этот файл не был замечен.

2

Добавьте @PropertySource("classpath: /your/properties/path/applicatio.properties") к вашему контроллеру и добавьте тег @Value в путь вместо @Autowired.

@Value("${java.io.tmpdir}")
private String path;
  • 0
    Спасибо за редактирование, я просто делал это
0

Эта строка вызывает ваше исключение:

@Autowired
private String path;

Autowiring работает только на Spring управляемых бобах, а String не следует рассматривать как один (IMO).

Вы можете использовать аннотацию @Value если хотите получить значение path из своего контекста. Или, если вы хотите использовать как есть, вы можете попробовать @Qualifier("path") вместе с @Autowired.

  • 1
    ИДК, почему он хочет Autowire String также
  • 0
    Спасибо за ответ, но использование приватного String path `@Value (" $ {path} ");` не решило мою проблему, у меня все еще есть ошибка. Разве мой боб Спринг не справился? Я автоматически подключил путь в некоторых моих тестах, и все работало нормально, хотя это не очень хорошее решение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню