Java EE pobieranie wartości adnotacji

0

Hej,

Mam adnotacje:

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

Interfejs:

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

Klasa implementująca interfejs i oznaczona adnotacją:

@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:

@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?

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ę

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.

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!

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:

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

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).

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())!

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?

0

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

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? :(

0

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

Raczej chcesz ten z CDI.</del>

0

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

 
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ć.

0

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

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 :-) )

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1