Inject annotation błędne przypisanie

Inject annotation błędne przypisanie
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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 ?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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

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

tutaj zwróci mi nulla a jak dam

Kopiuj
   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

edytowany 1x, ostatnio: Matrix12
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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:

Kopiuj
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());
    }
}

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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ć.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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:

Kopiuj
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

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

Kopiuj
<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>

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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/

edytowany 2x, ostatnio: Matrix12
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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:

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

mają

Kopiuj
    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ś?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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 ?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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ąć :)

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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 :

Kopiuj
 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
edytowany 2x, ostatnio: Matrix12
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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ć?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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:

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

nie ma


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
0

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

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

Kopiuj
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

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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).


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
0

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

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
TR
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:731
0

a że tak zapytam z jakiego IDE korzystasz?


musica curat corpus at animam
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
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 :

Kopiuj
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
}
M1
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:17
0

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

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.