Inject annotation błędne przypisanie

0

Witam,

bawie się anotacjami w javie i znalazłem jeden przypadek gdzie mi nie działa kod jak należy... Nie mogę znaleźć odpowiedzi na swój problem więc proszę Was o pomoc.

mam taki kod:
http://pastebin.com/BsRQXS88
http://pastebin.com/EtDSkzqm

W przypadku settera z @Inject zwraca mi to null a jeżeli usunę wywolanie metody number() to wtedy zwraca mi poprawnie obiekt, dlaczego tak się dzieje ?

1

Nie bardzo rozumiem o czym ty tutaj w ogóle mówisz. Przecież ten kod który pokazałeś nie ma sensu. Nie ma tam zadnych beanów ani żadnego providera CDI i nic nie zostanie wstrzyknięte, bo niby jak i czemu?

0

Jak nie zostanie wstrzyknięte? Jak mi zwraca prawidłowo dla : System.out.println(getNumber()); wynik jest "2" wiec jest ok... tylko dlaczego w przypadku

   @Inject
    public static void getNumber2(MyTest myTest) {
        String MyTest = myTest.number();
    }

tutaj zwróci mi nulla a jak dam

   private MyTest myTest;

   @Inject
    public static void getNumber3(MyTest myTest) {
       myTest = myTest;
    }

to zwraca mi serwis MyTest i mogę na nim odpalić metodę number();

P.S w pierwszym kodzie jest błąd w annotacji ale w powyższym przykładzie jest ok

0

To co piszesz nie jest możliwe bo wstrzykiwanie zależności odbywa się za pomocą kontenerów IoC/CDI i bez jakiegoś Welda, Guice czy Springa to sobie możesz dać i milion adnotacji a nic się nie wstrzyknie. Pokaż może CAŁY kod, tak żeby można to było uruchomić i stwierdzić co się W RZECZYWISTOŚCI dzieje w tym kodzie, bo póki co wstawiasz jakieś skrawki bez sensu a z twoich wyjaśnień też trudno stwierdzić co robisz.

0

Tak wygląda pełny kod :
http://pastebin.com/QGvyLNCF

Konsola zwraca mi to co chce w przypadku inject dla propertiesów a w przypadku settera na którym dodatkowo wykonuje kod nie działa.

1

hahahahaha masakra :D
Nic tutaj nie jest wstrzykiwane, tak jak mówiłem. Nie masz tu żadnego kontenera CDI więc nie miałoby to prawa działać. Wydaje ci sie ze działa bo wszystko jest tutaj static więc nie wymaga instancji obiektu do działania! Więc nawet na "nullu" zadziała wywołanie metody statycznej. Przykład:

public class A{
    public static String fun(){
        return "magic!";
    }
    public static void main(String[] args){
        A a = null;
        System.out.println(a);
        System.out.println(a.fun());
    }
}
0

Tutaj wyrzuciłem statica i nadal mi to działa prawidłowo: http://pastebin.com/8Z8U02Sm

Wiem, jak działa static tylko wysłałem kod na którym próbowałem to uruchomić.

1

Kłamiesz bo kod który wstawiłeś w poprzednim poście nawet się nie skompiluje. Jeszcze raz apeluje: pokaż kod który uruchamiasz i który pokazuje twój błąd.

Będę łaskawy i pokaże ci minimalny config dla CDI w aplikacji javy SE bez Springa:

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

import javax.inject.Inject;
import javax.inject.Named;

public class Runner {

    public static void main(String[] args) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        App application = container.instance().select(App.class).get();
        application.test();
        weld.shutdown();
    }
}

@Named
class App{
    @Inject
    public MyTest test;

    public void test(){
        System.out.println(getNumber());
    }

    public String getNumber() {
        return test.number();
    }
}

@Named
class MyTest {
    public String number() {
        return "2";
    }
}

i jako dependency

        <dependency>
            <groupId>org.jboss.weld.se</groupId>
            <artifactId>weld-se</artifactId>
            <version>LATEST</version>
        </dependency>

i w classpath w katalogu META-INF plik beans.xml z:

<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd" >
</beans>
0

Masz rację nie działa mi to prawidłowo.. zrobiłem gradle clean i przestało to działać. Bo znalazłem tutoriale gdzie był pokazany przykładowy kod i działało(rzekomo) bez takiej konfiguracji która ty przedstawiłeś

przykład : http://www.javacreed.com/why-should-we-use-dependency-injection/

0

O czym ty mówisz? o_O Doczytałeś ten art do końca? Przecież oni tam robią dokładnie to samo co ja, tylko zamiast Welda użyli Guice i zamiast mojego:

        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        App application = container.instance().select(App.class).get();

mają

    Injector injector = Guice.createInjector(new ProjectModule());
    Person person = injector.getInstance(Person.class);

Nie zauważyłeś tego tam? Tak samo zresztą jak i dziedziczenia po klasach z google.inject? Ty w które przeczytałeś to co podlinkowałeś?

0

Czyli muszę utworzyć kontener aby to mi działało inaczej nie będzie mi to działać tak? Co polecasz Welda czy Guice ?

0

W zasadzie to jest niewielka różnica czy użyjesz Welda, Guice czy Springa, poza samym tworzeniem kontenera reszta kodu z adnotacjami będzie wyglądać tak samo. O popularności Springa nie trzeba chyba nic mówić, Guice też jest bardzo popularny a Weld to dostawca CDI od JBossa więc też dość mocna marka.

0

Okej dzięki, ogólnie myślałem że to prosta sprawa dać adnotację i już pozamiatane a jednak trzeba dodatkowo konfigurować. Dopiero zaczynam w javie więc muszę to ogarnąć :)

0

Faktycznie, te 3 linijki "konfiguracji" to jest taka ciężka sprawa że chyba lepiej sobie odpuścić... ;]

0

E tam nie jest źle, po prostu jak zacznę coś robić tak płynie jak Ty to muszę to zrozumieć.

@Shalom Mam problem z Twoim kodem próbuje zrobić ten container ale wali mi błędami...

MyAnonym.java
http://pastebin.com/TkvSFc97
Runner.java
http://pastebin.com/6A5ZNFn7
beans.xml
http://pastebin.com/MseiYtFB

build.gradle

http://pastebin.com/usRFdGLq

Bład który dostaje to :

 java mypackage.Runner 
Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/weld/environment/se/Weld
        at mypackage.Runner.main(Runner.java:12)
Caused by: java.lang.ClassNotFoundException: org.jboss.weld.environment.se.Weld
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more
0

Czy ktoś może mi odpowiedzieć czy ogólnie CDI, Weld, czy Guice działa tylko po wgraniu na serwer? Czy console application też będą mogły z tego skorzystać?

0

Ty sobie robisz jaja teraz? A ten kod który pokazałem wyżej to działa na jakimś serwerze? o_O Przecież masz tam normalną konsolową aplikacje spinaną przez Welda, a niżej jeszcze analogiczny konfig dla Guice. Moja rada: zacznij moze od nauki podstaw programowania, hello worldy i takie tam, bo teraz to wyglądasz mniej wiecej tak:

user image

0

Ten kod prze kleiłem i sypie mi takim błędem, dlatego pytam co jest nie tak. Wysłałem Ci kod, jeżeli będziesz tak łaskaw to proszę o weryfikację w którym miejscu zrobiłem babola.

0

A no widzisz geniuszu, edytowałeś posta a wtedy nie widać że "pojawiło się coś nowego". java.lang.NoClassDefFoundError = brak jakiegoś jara czyli błąd w konfiguracji gradle. Masz tam kupę zależności a tej której potrzebujesz:

        <dependency>
            <groupId>org.jboss.weld.se</groupId>
            <artifactId>weld-se</artifactId>
            <version>2.3.5.Final</version>
        </dependency>

nie ma

0

Sorry nie jestem geniuszem ;/ natomiast w pliku build.gradle mam to : compile 'org.jboss.weld.se:weld-se:2.3.5.Final', piąty wynik od góry. Dlatego proszę o pomoc bo nawet tutoriale które znalazłem miały tą zależność, oczywiście robiłem gradle dependencies.

0

Wywal inne weldowe zależności i dodaj tylko tą jedną. W ogóle potrzebne ci tylko:

    compile 'javax.inject:javax.inject:1'
    compile 'org.jboss.weld.se:weld-se:2.3.5.Final'

bo może stąd cos nie chce działać

0

Ok, wywaliłem ale nadal nic. Bład:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/weld/environment/se/Weld
        at mypackage.Main.main(Main.java:12)
Caused by: java.lang.ClassNotFoundException: org.jboss.weld.environment.se.Weld
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more

build.gradle :

repositories {
    mavenCentral()
    mavenLocal()
    jcenter()
}
apply plugin: "java"
apply plugin: 'application'

mainClassName = "org.jboss.weld.environment.se.StartMain"

dependencies {
    compile 'javax.inject:javax.inject:1'
    compile 'org.jboss.weld.se:weld-se:2.3.5.Final'
}

sourceSets {
    main.java.srcDir "src/main"
    test.java.srcDir "src/test"
}

processResources.doLast {
    copy {
        from 'build/resources/main/META-INF/beans.xml'
        into 'build/classes/main/META-INF/'
    }
}

struktura katalogów :

src
-main
- java
- mypackage
- Runner.java
- App.java
- MyTest.java
-resource
- META-INF
- beans.xml

Może ja to źle odpalam ?

Bo robie gradle build ---- successful

potem wchodze do build/classes/main/ i odpalam java mypackage.Runner

0

potem wchodze do build/classes/main/ i odpalam java mypackage.Runner

Aaaa słabo mi, wody... Litośći! Weź ty chłopie zacznij od jakiegoś Hello Worlda może, bo aż żal patrzeć co ty wyprawiasz. Serio, takie rzeczy omawiane są na pierwszych stronach dowolnego kursu Javy.
Oczywiście że nie możesz tak tego uruchomić bo classpath sie sam nie ustawi magicznie. Skad java miałaby wiedzieć skad wziąć te biblioteki?
Jak bardzo chcesz być masochistą i odpalać z palca w konsoli to musisz użyć parametru -cp. Mozesz też jak cywilizowany człowiek zbudować sobie z tego jara z zależnosciami albo po prostu uruchamiać z jakiegoś IDE (jak IntelliJ).

0

Okej, ale jara muszę odpalić poprzez jbossa albo tomcata czy przez konsolke mi to przejdzie?

0

Odpal najlepiej przez marsjańskiego łazika, dla pewności. java -jar jestem_leniem_i_nie_umiem_szukać_w_google.jar

0

a że tak zapytam z jakiego IDE korzystasz?

0

InteliJ ale kod trzymam na vagrancie i po prostu to IDE nie działa mi ze wszystkimi dodatkami.

Przy korzystaniu z java -jar wywala mi takiego exceptiona, Exception in thread "main" java.lang.IllegalStateException: WELD-ENV-000016: Missing beans.xml file in META-INF , gradle jakby nie dołącza do jara pliczku beans.xml

task którym tworze jara wygląda tak :

task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',
                'Implementation-Version': version,
                'Main-Class': 'mypackage.Main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}
0

Dobra był błąd w ścieżce do beans.xml, teraz mi działa prawidłowo.

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