Java EE pobieranie wartości adnotacji

Java EE pobieranie wartości adnotacji
DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0

Hej,

Mam adnotacje:

Kopiuj
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface ConfigurationObject {
    String fileName();
}

Interfejs:

Kopiuj
public interface IConfiguration {
    void setConfiguration(String fileContent) throws JAXBException;
}

Klasa implementująca interfejs i oznaczona adnotacją:

Kopiuj
@Singleton
@ConfigurationObject(fileName = "Configuration.xml")
public class Configuration implements IConfiguration{

    @Inject
    private Logger logger;
    private ConfigurationFile configurationFile;

    @Override
    public void setConfiguration(String fileContent) throws JAXBException {
        logger.info("PLIK ZALADOWANY!: " + fileContent);
       }
}

Oraz pobieranie obiektów danego interfejsu:

Kopiuj
@Singleton
@Startup
public class ConfigurationsReader {

    private final String CONFIG_DIRECTORY = "/opt/game/DATA/GameFiles/";

    @Inject
    private Logger logger;

    @Inject @Any
    Instance<IConfiguration> configurationBeans;

    @PostConstruct
    public void loadConfigurations() {
        for(IConfiguration confObject : configurationBeans) {
            String fileName = confObject.getClass().getAnnotation(ConfigurationObject.class).fileName();
            if(fileName != null) {
                String fileContent = "";
                try {
                    fileContent = new String(Files.readAllBytes(Paths.get(CONFIG_DIRECTORY + fileName)));
                    confObject.setConfiguration(fileContent);
                } catch (IOException | JAXBException ex) {
                    if(ex instanceof  IOException) {
                        logger.error("File read exception, file name: " + fileName + ", EXCEPTION: ", ex.getMessage());
                    } else if(ex instanceof JAXBException) {
                        logger.error("Error while xml marshall in class: " + confObject.getClass().getName()
                                + ", EXCEPTION: ", ex.getMessage());
                    }
                }
            }
        }
    }

Przy wykonaniu pobrania adnotacji wywala NullPointerException. Ogólnie nie widzi żadnej adnotacji. Jak wyciągnąć adnotacje z klasy implementującej dany interface?

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0

Pomoże ktoś? :P

wydaję się jakby nie widział klasy tylko interface a potrzebuje wyciągnać wartośc z adnotacji klasy implementującej daną adnotację

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
1

Możliwe, że masz problem z mieszaniem CDI i EJB 3.1 (ale tylko zgaduje, nie mam siły tego sobie odpalać - jaki server, build etc..., za mało podałes danych)

http://stackoverflow.com/questions/14019030/controlling-cdi-startup-inside-ejb-3-1

Btw. widac, że już dojrzały z Ciebie programista - nie męcz sie tym bagnem z annotacjami. Nie potrzebujesz tego.

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
0

Jeśli nulla masz tutaj:
String fileName = confObject.getClass().getAnnotation(ConfigurationObject.class).fileName();

To zobacz co to jest confObject.getClass() - i ewentualnie zapytaj o annotacje z parent classy.

Dzięki @Shalom - twój komentarz podał mi alternatywny problem jaki może miec autor!

SP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 127
0

Generalnie to chyba bardziej elegancko byłoby to napisać jako rozszerzenie CDI, ja ostatnio próbowałem ale poległem ;) (chociaż dotyczyło ono czegoś innego)
Wtedy mógłbyś to zrobić jakoś tak:

Kopiuj
class MyExtension implements Extension {
   <T> void processAnnotatedType(@Observes @WithAnnotations({ConfigurationObject.class}) ProcessAnnotatedType<T> pat) {
      ...
   }
}

Tu jest przykład nieco podobny do twojego:
https://www.javacodegeeks.com/2014/02/tutorial-writing-your-own-cdi-extension.html

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0
jarekr000000 napisał(a):

Jeśli nulla masz tutaj:
String fileName = confObject.getClass().getAnnotation(ConfigurationObject.class).fileName();

To zobacz co to jest confObject.getClass() - i ewentualnie zapytaj o annotacje z parent classy.

Dzięki @Shalom - twój komentarz podał mi alternatywny problem jaki może miec autor!

Chodzi mi o to że mam nulla przy: confObject.getClass().getAnnotation(ConfigurationObject.class)
Nie mogę pobrać adnotacji z klasy (Configuration) implementującej ten interfejs (IConfiguration).

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
0
darksead napisał(a):

Chodzi mi o to że mam nulla przy: confObject.getClass().getAnnotation(ConfigurationObject.class)
Nie mogę pobrać adnotacji z klasy (Configuration) implementującej ten interfejs (IConfiguration).

Ale zobacz co to za klasa (System.out.println(confObject.getClass().getName())!

  • Rejestracja: dni
  • Ostatnio: dni
1
jarekr000000 napisał(a):
darksead napisał(a):

Chodzi mi o to że mam nulla przy: confObject.getClass().getAnnotation(ConfigurationObject.class)
Nie mogę pobrać adnotacji z klasy (Configuration) implementującej ten interfejs (IConfiguration).

Ale zobacz co to za klasa (System.out.println(confObject.getClass().getName())!

Nazwa interfejsu czyli IConfiguration. Jak sprawić żeby mieć dostęp do klasy która go implementuje?

  • Rejestracja: dni
  • Ostatnio: dni
0

A dokładnie: com.gapplication.configurations.IConfiguration$2027069204$Proxy$_$$_Weld$EnterpriseProxy$

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0

Zauważyłem że gdy zmienie adnotacje klasy Configuration z @Singleton na @Dependent to działa, jak to ogarnąć żeby działało z @Singleton? :(

M9
  • Rejestracja: dni
  • Ostatnio: dni
0

A co to za Singleton? Bo masz:
javax.ejb.Singleton (EJB) i i javax.inject.Singleton (CDI).

Raczej chcesz ten z CDI.</del>

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
0

Tak jak posiałem nie sa potrzebne Ci te adnotacje...
W istocie to co chcesz zrobić:

Kopiuj
 
public interface IConfiguration {
    void setConfiguration(String fileContent) throws JAXBException;
    
    String getConfigurationName() ;
}
....
@Singleton
public class Configuration implements IConfiguration{
    
    private ConfigurationFile configurationFile;
 
    public String getConfigurationName() {
        return "Configuration.xml";
    }
...

@PostConstruct
    public void loadConfigurations() {
        for (IConfiguration confObject : configurationBeans) {
            String fileName = confObject.getConfigurationName();
            if (fileName != null) {

        .....


No bo jeżeli w takiej klasie Configuration możesz podać nazwę pliku w adnotacji - to możesz też w metodzie.... (w czym to jest gorsze?).
Tak, wiem nie wygląda tak magicznie, ale działa ... choć generalnie jeszcze można ten kod mocno uprościć.

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0

jesli zmienię singeltona z javax.inject.Singleton na javax.ejb.Singleton to już się nawet nie wrzuca na serwer

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
0

A teraz Cię zasmucę - wrzuciłem w między czasie u siebie na glassfish i działa twój kod tak jak napisałeś. (ale nie powinien :-) )

  • Rejestracja: dni
  • Ostatnio: dni
DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 145
0

hmm... Ja niestety muszę to uruchomić na Wildfly 10 i niestety nie działa dostaję nulla gdy chcę siędobrać do adnotacji ;(

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.