2017-01-02 56 views
0

我有一些來自外部庫的java對象,我需要在我的spring項目中注入它。問題是從庫中的類是不知道的任何彈簧API的類似於CDI的Spring中的POJO注入

如果我注入豆從圖書館服務使用@Autowired我越來越org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type

以下是我的服務類

@Path("/test") 
public class TestService { 

    @Autowired 
    SomeOtherClass service; 

    @GET 
    public Response get(){ 
     return Response.ok(service.someMethod()).build(); 
    } 
} 

和以下是我從圖書館類,這是不知道春天

public class SomeOtherClass { 

    public String someMethod(){ 
     return "Data from library"; 
    } 
} 

,當我調用我的服務,我得到異常作爲

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.SomeOtherClass' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

有沒有辦法在spring中注入一個普通的Java對象,類似於注入的**CDI**? 有一個選項可以定義applicationcontext.xml並在xml中定義SomeOtherClass並使用getBean,但我不想那樣做。有沒有其他的選擇?

注:

以下選項不能被考慮,因爲我從圖書館

到來類 100's
  1. Cannot use applicationcontext.xml

  2. Cannot @Configuration @Bean to produce beans

+1

你不需要'getBean'你只需要聲明一個'SomeOtherClass'的實例,那麼'@ Autowired'就可以工作。 Spring只會注入託管bean(就像CDI,如果某個東西不是託管bean,它也不會注入任何東西)。 –

+1

然後不要使用spring ...你需要讓這些類被稱爲spring管理實例,如果你不這樣做將無法工作。如果你不能(或不會)使用基於xml或java的配置,那麼spring沒有太多的幫助。 (雖然你可以延伸春天來檢測/掃描那些類,但這需要一些有關內部和春天工作的知識)。 –

回答

3

您可以使用@Configuration和@Bean註釋如下 -

創建一個新類:

@Configuration 
public class AppConfig { 

    @Bean 
    SomeOtherClass someOtherClassBean(){ return new SomeOtherClass();} 

} 

現在自動佈線應工作。它實際上是在創建一個bean並讓Spring知道它。

+0

我想到了這個選擇,但是我有很多來自圖書館的課程(100s)。有沒有辦法避免編寫Configuration和Bean,並告訴Spring在Autowire中注入純對象? –

+0

該代碼甚至不會編譯... –

+0

@ M. Deinum請參閱編輯。 – gba

1

也許嘗試編程添加豆類的IoC容器: Add Bean Programmatically to Spring Web App Context

你需要找到所有你想要的實例並使用在連接問題的方法之一的類。

+0

編寫額外的代碼來實現注入類似於具有上下文文件或bean配置。我正在尋找類似於java ee –

+1

中的bean-discovery-mode =「ALL」的一些支持即開即用的支持。我不確定是否有類似的東西,它對我來說甚至是有意義的。在我看來,在大多數用例中,控制進入IoC容器的內容是有意義的。希望你會找到有用的東西。讓我們知道:-) – gba

1

您可以使用反射以編程方式添加Bean定義。

@Override 
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { 
    Reflections ref = new Reflections(new ConfigurationBuilder() 
      .setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner()) 
      .setUrls(ClasspathHelper.forPackage(PACKAGE_NAME)) 
      .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(PACKAGE_NAME)))); 
    ref.getSubTypesOf(Object.class).stream() 
      .forEach(clazz -> { 
       logger.info("Defining pojo bean: {} -> {}", Introspector.decapitalize(clazz.getSimpleName()), clazz.getCanonicalName()); 
       registry.registerBeanDefinition(Introspector.decapitalize(clazz.getSimpleName()), 
         BeanDefinitionBuilder.genericBeanDefinition(clazz).getBeanDefinition()); 
      }); 
} 

隨後,這些豆可以在其他地方@Autowired。參見要點:https://gist.github.com/ftahmed/a7dcdbadb8bb7dba31ade463746afd04