2013-05-01 16 views
38

Mam DataPrepareService, która przygotowuje dane dla raportów i mam Enum z typami raportów, i muszę wstrzyknąć ReportService do Enum lub mieć dostęp do ReportService z wyliczenia.Wstrzykiwanie fasoli do enum

mój serwis:

@Service 
public class DataPrepareService { 
    // my service 
} 

mój enum:

public enum ReportType { 

    REPORT_1("name", "filename"), 
    REPORT_2("name", "filename"), 
    REPORT_3("name", "filename") 

    public abstract Map<String, Object> getSpecificParams(); 

    public Map<String, Object> getCommonParams(){ 
     // some code that requires service 
    } 
} 

Próbowałem użyć

@Autowired 
DataPrepareService dataPrepareService; 

, ale to nie działa

Jak mogę wprowadzić moją usługę do wyliczenia?

Odpowiedz

8

Może coś takiego:

public enum ReportType { 
    @Component 
    public class ReportTypeServiceInjector { 
     @Autowired 
     private DataPrepareService dataPrepareService; 

     @PostConstruct 
     public void postConstruct() { 
      for (ReportType rt : EnumSet.allOf(ReportType.class)) 
       rt.setDataPrepareService(dataPrepareService); 
     } 
    } 

    REPORT_1("name", "filename"), 
    REPORT_2("name", "filename"), 
    ... 
} 
+1

downvote for not compile – Pranalee

+0

Twój powinien zmienić klasę wewnętrzną na statyczną klasę –

1

trudno będzie kontrolować, że pojemnik sprężyna jest już uruchomiony w momencie wyliczenia jest tworzony (jeśli miał zmienną tego typu w teście -case, twój kontener zwykle tam nie będzie, nawet aspektj nie pomoże w jego wyprowadzaniu). polecam po prostu pozwolić na usługę dataprepare lub coś, co daje ci specyficzne parametry z metodą odnośnika z parametrem enum.

38
public enum ReportType { 
    @Component 
    public static class ReportTypeServiceInjector { 
     @Autowired 
     private DataPrepareService dataPrepareService; 

     @PostConstruct 
     public void postConstruct() { 
      for (ReportType rt : EnumSet.allOf(ReportType.class)) 
       rt.setDataPrepareService(dataPrepareService); 
     } 
    } 

    REPORT_1("name", "filename"), 
    REPORT_2("name", "filename"), 
    ... 
} 

weekens' answer prace jeśli zmienisz wewnętrzną klasę statyczną więc wiosną można zobaczyć to

+1

Uratujesz mój dzień. Dziękuję Ci! –

+1

Coś tu zanotować, powyższy kod nie skompiluje się, ponieważ klasa statyczna jest zdefiniowana przed stałymi enum. Według specyfikacji java, stałe enum pojawiają się przed każdym deklarowaniem klasy. Po prostu ustawiajcie stałe i swoją klasę w dół. – prettyvoid

0

Enum s są statyczne, więc trzeba wymyślić sposób, aby uzyskać dostęp do ziarna od statycznego kontekstu.

Można utworzyć klasę o nazwie ApplicationContextProvider, która implementuje interfejs ApplicationContextAware.

import org.springframework.beans.BeansException; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 

public class ApplicationContextProvider implements ApplicationContextAware{ 

private static ApplicationContext appContext = null; 

public static ApplicationContext getApplicationContext() { 
    return appContext; 
} 

public void setApplicationContext(ApplicationContext appContext) throws BeansException { 
    this.appContext = appContext; 
} 
} 

następnie dodać ten plik context Zastosowanie:

<bean id="applicationContextProvider" class="xxx.xxx.ApplicationContextProvider"></bean> 

po tym można było uzyskać dostęp do kontekstu aplikacji w sposób statyczny tak:

ApplicationContext appContext = ApplicationContextProvider.getApplicationContext(); 
0

myślę to czego potrzeby:

public enum MyEnum { 
    ONE,TWO,THREE; 
} 

Autowire enum jak zwykle

@Configurable 
public class MySpringConfiguredClass { 

      @Autowired 
     @Qualifier("mine") 
      private MyEnum myEnum; 

} 

Oto sztuczka, należy użyć fabrycznie metodę = "valueOf", a także upewnić się, lazy-init = "false"

więc pojemnik tworzy fasoli z góry

<bean id="mine" class="foo.bar.MyEnum" factory-method="valueOf" lazy-init="false"> 
    <constructor-arg value="ONE" /> 
</bean> 

i gotowe!

Powiązane problemy