Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Van egy Item class, és egy Price class. Az Item-hez tartozhat sok Price, amik pedig 1 itemhez vannak kötve, de a hibernate azért is generál hozzá egy kapcsolótáblát, pedig szükségtelen. Miért?

    Ilyen a kapcsolat a két osztályban:

    Item:
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "item", orphanRemoval = true)
    private Set<Price> prices;

    Price:
    @ManyToOne(fetch = FetchType.LAZY)
    private Item item;

    Próbáltam @JoinColumn-al is, akkor is ugyan az. Egy netes példában is pont így csinálta, és mind2 megelőzte a kapcsolótáblázást, de nekem nem.

    Nem lehet, hogy véletlen egy korábbi próbálkozás eredménye ragadt bent a DB-ben?

    Ha nem, akkor szerintem ennél több infó kell, hogy meglehessen válaszolni, bár én nem vagyok egy nagy Hibernate-expert.

  • floatr
    veterán

    Szűz springboot appnál a session scoped beanek tökjól működnek authentikáció nélkül. Securitys appnál nincs session, mindig elfelejtődik ugyanolyan beanekkel.

    Úgyhogy deklaráltam egy mapet, aminek a kulcsa a principal.getusername, aztán abba rakosgatnak, vesznek ki a feldolgozók

    Tudsz saját scope-ot is definiálni

  • Lortech
    addikt

    Na igen, ez a kérdés. Mert spring security nélkül, egy sima szűz springboot alkalmazásban, a restcontroller getmapping metódusainak httpsession id-je minden kérésnél különbözik, a session.setAttribute-ban állított dolog pedig mindegyik globális, mindegy milyen böngészőről/kliensről van a beállító kérés, mindegyiknek ugyan az lesz a getattribute valami értéke amit az egyik legutoljára settelt...

    Most tényleg valami principal azonosítót kérjek le, és azokat kulcsként használva töltögessek egy adattároló map-et, ahonnan a kulcs alapján lekérdezhető az adott userhez tartozó adat?
    Azt hittem hogy erre van valami belső megoldás mert azért nem hiszem hogy annyira réteg igény lenne.

    Egy spring alkalmazásban (is) a session életciklusa beállítás kérdése. Amit írsz, azt szerintem benézed, vagy spéci beállításod van (tehát nem szűz spring boot app ), nem ez a default működés.
    Egy request feldolgozás viszonyában a session (id) alapvetően attól függ, hogy a böngésződ küldött-e a requestben session id-t (JSESSIONID cookie (default)) , és hogy mi a spring appod sessionCreationPolicy-je, ezektől függően fogja a Spring (újra)használni a kapott sessionid alapján a meglévő sessiont (az objektumot, nem az id-t) vagy újat gyártani vagy nem gyártani vagy teljesen ignorálni a sessiont (springen kívül továbbra is létrehozható session).

    a session.setAttribute-ban állított dolog pedig mindegyik globális, mindegy milyen böngészőről/kliensről van a beállító kérés, mindegyiknek ugyan az lesz a getattribute valami értéke amit az egyik legutoljára settelt
    Ez nem így működik, pont az a session lényege, hogy egy session példányhoz és állapothoz (így a session attribútumaihoz) csak azok a kliensek férnek hozzá, amelyek azonos session id-val rendelkeznek.
    Szerinted téged a spring session fixation védelme zavarhat meg, emiatt látsz különböző session id-kat és emiatt tűnik úgy, hogy a sessionök különbözőek (valójában ugyanazok a sessionök különböző session id-val), mégis ugyanazok az attribútumai.

  • mobal
    nagyúr

    Mi a legegyszerűbb módja springbootos, jwt springsecuritys, frontenddel rest-en kommunikáló alkalmazásnál az adott sessionhoz, vagy userhez kötött, több requesten átívelő ideiglenes adattárolásra?

    Igazából annyit kellene tárolni hogy adott user sessionben hány requestje volt az alkalmazás felé, floodot megelőzni.

    Ha rest az API akkor szerintem stateless kell megoldanod úgy hogy újra tudd alkotni az adatokat.

    Bucket4j-t nézted?

  • Lortech
    addikt

    Mi a legegyszerűbb módja springbootos, jwt springsecuritys, frontenddel rest-en kommunikáló alkalmazásnál az adott sessionhoz, vagy userhez kötött, több requesten átívelő ideiglenes adattárolásra?

    Igazából annyit kellene tárolni hogy adott user sessionben hány requestje volt az alkalmazás felé, floodot megelőzni.

    Magától értetődően legegyszerűbb maga a session (HttpSession), ha tényleg van... Ugye ez nem egyértelmű RESTful API-nál és JWT authentikációnál, aminek statelessnek kéne lennie.
    Komolyabb alkalmazásnál floodot még az alkalmazás előtt célszerű megfogni, api gatewayen, proxyn, load balanceren stb.

  • don_peter
    senior tag

    flutter mindenre jó, mobil appra, webre is, és már beta-ban desktop appot is lehet vele.
    Az adott platform natív kódjára fordul. Nagyon gyors, szép, és gyorsan is lehet vele fejleszteni, mert nem az IT rákos daganatára (js) épül.

    Te benne vagy a témában? Indítottam neki témát, ha esetleg lenne további infód és tapasztalatod szívesen venném itt: Flutter téma címe

  • mobal
    nagyúr

    Java 8-as maven projekt migrálása újabb, moduláris java verzióra pl 17-re hogy?

    Van valami automatikus megoldás? Vagy manuálisan kell? :/

    Én visszafelé csináltam. Alá rakod az új jdk-t, build és ami nem jó javítani kell. A bájt kód verziót állítsd a megfelelőre.

  • Java 8-as maven projekt migrálása újabb, moduláris java verzióra pl 17-re hogy?

    Van valami automatikus megoldás? Vagy manuálisan kell? :/

    A Java 9-ben megjelent modulokat nem kötelező használnod. Ettől eltekintve pedig a munka nagy része a különböző dependency-k frissítése új verzióra. Persze, projekttől függően lehetnek extrémebb dolgok, de semmi olyan, amit már nem oldott meg valaki.

  • disy68
    aktív tag

    Java 8-as maven projekt migrálása újabb, moduláris java verzióra pl 17-re hogy?

    Van valami automatikus megoldás? Vagy manuálisan kell? :/

    Vannak tool-ok, amik segíthetnek itt olvashatsz az egészről részletesebben.

  • mobal
    nagyúr

    Sziasztok!

    Olyan ták feladatot kaptam, hogy a swaggeres apin kapott tömeges feladatcsomagot (hash generálás, de nem crypto :) ) valamilyen felhőszolgáltatáson futtassak meg, majd a kész csomagot vissza az apin.

    Erre a fejemben összeállt egy fő alkalmazás, ami lekéri a feladatokat az api-tól, bedobálja a queue-be ahonnan a számoló kis alkalmazás példányok kiveszik, megcsinálják, majd a kész queue-be dobálják, ahonnan a fő alkalmazás kiszedi, és küldi vissza az api-nak.

    Jól gondoltam ezt el? Milyen free szolgáltatás lenne ehhez a legegyszerűbb, és milyen kiinduló ponttal? (soha nem csináltam még felhős programozást, van aki az AWS-t ajánlja, de eléggé kaotikus az is)

    Szinkron vagy aszinkron megoldás kell? Kapsz egy requestet egy végpontra, ahol meg is várja a hívó fél a kimenetet vagy vissza kell szólond majd ha megvan a válasz?

    Ehhez nem feltétlenül kell aws, ott az ingyenes heroku is. De lokálban is megcsinálhatod docker segítségével.

  • bambano
    titán

    Hashmap, meg minden erre alapuló ugye gyorsan tud keresni, kb függetlenül a benne lévő elemek számától.
    De még is hogy találja meg azt, hogy a keresett hash az hol van? A doksi szerint linkedhashmap az alapja, de hogy találja meg a megfelelő node-ot, ha linkelve van? Hogy nem kell valahonnan elkezdve a linkeken lépegetni addig amíg meg nem találja a keresett keyt?

    Ha végiglépked, akkor csak azért gyorsabb mint egy list contains pl, mert nem equals megy többnyire, hanem hash==hash?

    nem ismerem, hogy a jáva ezt hogy csinálja, de a rendes eredeti hash tárolási struktúra egyáltalán nem keres hash értéket. ettől gyors.
    és úgy tartják fenn az elemek növekedése ellenére a gyorsaságot, hogy módosítják a hash függvényt.

  • togvau
    senior tag

    Ez se nyert: https://pastebin.com/X4ibhvWh
    Beletákolva valami httpclient függőséget már elindul, de amikor kellene csinálnia, akkor:
    org.springframework.web.client.HttpClientErrorException: 400 Bad Request
        at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:85)
        at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:707)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:660)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:620)
        at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:414)

    Az eredeti hiba a szokásos: https://pastebin.com/2RmS1DHS

    ja igen, végül is műxik, ezt a szerver dobja vissza.

  • Lortech
    addikt

    helllo, adott egy java 8 (adoptopenjdk) maven springboot projekt.
    Innen egy webservicet használnék (ekáer), úgy tűnik resttemplate-el. A programozás része eddig egyszerű volt, de a rendszergazda rész megint szívat, mivel köszönhetően a tetves google-nek ez is SSL...
    Jön is az imádott sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    Ezen szeretnék túljutni a lehető leggyorsabban, és legegyszerűbben. Nem érdekel az úgynevezett "biztonság". Hordozhatóvá szeretném csinálni, ilyen cacertes minden gépen ahol fut létrehozós, mindent servicet amit használ letöltős dolgokat el szeretném kerülni.
    Azt szeretném, hogy az intellij fejlesztőkörnyezetből, meg war-ba csomagolva és akárhol indítva is ugyanúgy működjön, mindenféle gépenként rendszergazdás tákolás nélkül.
    úgy szeretném mint böngészőből, be az url azt jóvan, működik, nem cert marháskodik.

    Hogy érhetem el ezt? Googlen nem működő, vagy nem ide vonatkozó, vagy hiányos leírásokat találtam csak.

    Áh, mavenes a projekt, ott a bibi, használj gradle-t, az ezt is megoldja. :D
    Nyilván pontos válaszhoz kéne egész pontos infó, hogy a TLS handshake melyik ponton döglik, pl. openssl s_client kimenet, de ágyúval verébre megoldás itt:
    https://stackoverflow.com/a/45444355

  • sztanozs
    veterán

    hogy lehet megaszondani, hogy a fájlt (string-ben van megadva a path majd Paths.get() ) az alkalmazás mellől olvassa? Tehát aprojektem mellé rakott fájlt akkor is ha IDE-ből indítom run-al, meg akkor is ha jar-ba van exportálva, és java -jar-al indítom.
    Mert ugye ha simán fájl.txt akkor ide-ből indítva a projekt mappában keresi, jar-ba exportálva a jar mellett keresi, de mindenképpen relatív path maradjon, és kíndózon, linuxon ugyan az legyen a végeredmény.

  • Szmeby
    tag

    Én arra se emlékszem amit múlt héten olvastam, főleg ha nem találkozok rendszeresen az ott olvasott dologgal. Sajnos nem fér el a sok számot, kis-nagybetűt, és most már speciális karaktert is kötelezően tartalmazó jelszavak, meg az évszak divatjainak megfelelő frameworkok felesleges infoi mellé.
    Annyira nem közismert, hiszen akkor a google-n rögtön kidobott volna rá ilyen megoldást, még is, erre a hibára csak a rossz importos válaszú dolgokat dobta fel.
    Igényes munkát nem akarok végezni, hiszen egy igénytelen ürülékrakást kell úgy ahogy használhatóvá tákolni, hiszen újraírásra (amivel igényessé lehetne tenni) nincs pénz :D

    Mi a nevetséges abban, hogy egy hiányosságot fikázok? Ez egy marhaság. Default mindkettőt néznie kéne. De legalább is specifikus errorban jelezni, hogy máshogy kéne.

    Sajnálattal hallom. Az én emlékezetem is egy aranyhaléval vetekszik. Javaslok egy jelszókezelőt, nekem bevált.

    Bizonyára megtehetné, hogy mindkettőt nézi, persze. Csak ez az extra kényelem a háttérben iszonyatos komplexitást generál. A fejlesztők hoztak egy döntést, hogy ez a kényelem nem tesz hozzá annyit, hogy emiatt a framework mondjuk lomha legyen.

    Persze ha tudsz egy olyan megoldást, ami nem rontja a framework hatékonyságát, mégis kényelmes, javaslom, beszélgess a hibernate készítőkkel, talán vevők lesznek az ötletre. A hibaüzi mondjuk jól hangzik.

  • floatr
    veterán

    húúú nem hittem volna, hogy ennyire gagyi :)
    sajnos nincs kapacitás az 5642 divatos framework lelki világát, bugjait, hiányosságait bemagolni.
    Hogy sikerült rátalálni? Én akárhogy is kerestem rá guglin, csak olyan jött ki, hogy nem azt a transient-t használja ami oda kell, hanem másikat.

    https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/access.html
    Azért használ eltérő módszert a két elérésre, mert field access esetében kell proxy/introspection/reflection. A hiányosság itt a framework és a technológia ismeretében van.

  • Szmeby
    tag

    húúú nem hittem volna, hogy ennyire gagyi :)
    sajnos nincs kapacitás az 5642 divatos framework lelki világát, bugjait, hiányosságait bemagolni.
    Hogy sikerült rátalálni? Én akárhogy is kerestem rá guglin, csak olyan jött ki, hogy nem azt a transient-t használja ami oda kell, hanem másikat.

    Én például onnan tudom, hogy valamikor régen olvastam a hibernate dokumentációjában. Szerintem elég közismert dolog... legalábbis a dokumentációba belelapozó emberek között. Én úgy vagyok vele, hogy ha igényes munkát akarok végezni, akkor érdemes megismerni a használt frameworkot kicsit közelebbről is. Így amikor fikázom, talán kisebb eséllyel teszem magamat nevetségessé. :)

    szerk.: A jelenség a transient módosítótól teljesen független.

  • floatr
    veterán

    JPA: eddig én a saját cuccaimban, és a munkáknál is az entity osztályoban a field deklarációk fölé raktam az annotációkat, pl a a kapcsolatok, vagy a @Transient-et is.

    Mostani projektben a getterek fölött van, úgyhogy igazodtam ehhez, egy kivétellel amikor egy @Transient fieldet csináltam. Aztán folyamatosan elszállt runtime, hogy nem találja azt a fieldet... javax persistence transient volt pedig, de a spring datással is ugyan ez.
    Aztán "áh ez már kb az imádkozás szint" átraktam a getter fölé, és megy...

    Ez WTF?

    A hibernate az @Id annotáció alapján választ stratégiát arra, hogyan kezelje a bean adatait. Ha field-en van, akkor reflection-t használ mindenre, ha getteren, akkor a metódusokat. Vegyesen csak akkor lehet használni, ha felülcsapod a default stratégiát egy @Access(AccessType.FIELD) annotációval, amit a field-re akasztasz rá.

    Imádkozás helyett specifikáció, vagy tutorial. Ez a középkorban is sokszor bevált volna.

  • togvau
    senior tag

    "Unexpected bound" a Class<T extends AbstractInvoiceEntity> newClass-re.

    #11308 az már részletkérdés lenne :) mindegyik 0 paraméteres, szóval elég lenne, de a fenti probléma miatt így se, úgy se jó :(

    Látom, elég csak a kimenetnél megszabni a korlátozást, és az a bemenetre is vonatkozik.

    De újabb probléma: a newClass-nak vannak tételei is listában, minden invoice-nak saját fajta... azok is egy közös abstract osztályból származnak, de hogy tudok nem fixen létrehozni tétel osztályt?
    kimeno.callTetelekLista().getClass().getGenericSuperclass(); talán így meg van a listaelemek osztálya (már ha akkor is működik ha a call null-t ad vissza, mert nincs list még hozzáadva)
    (mert futás időben nincs generikus)

    De hogy ha van egy metódus, hogy getItemType és abba egyenként fixen meg van adva entitynként, hogy mi tartozik hozzá, akkor be tudom szerezni a classt. Viszont hogy hozom létre, hogy hozzáadhassam a listához? newInstance oké

  • Drizzt
    nagyúr

    "Unexpected bound" a Class<T extends AbstractInvoiceEntity> newClass-re.

    #11308 az már részletkérdés lenne :) mindegyik 0 paraméteres, szóval elég lenne, de a fenti probléma miatt így se, úgy se jó :(

    E helyett: Class<T extends AbstractInvoiceEntity> newClass siman Class<T> newClass kell.

  • disy68
    aktív tag

        protected static KimenoSzamlaEntity getInvoiceEntity(AbstractInvoiceEntity originalEntity) {
            KimenoSzamlaEntity kimeno= new KimenoSzamlaEntity();
            BeanUtils.copyProperties(originalEntity,kimeno,"parentInvoice", "identifier");
            List<KimenoTetelekItemsEntity> items=new ArrayList<>();
            for (AbstractInvoiceItemsEntity item: originalEntity.callTetelekLista()) {
                KimenoTetelekItemsEntity itm= new KimenoTetelekItemsEntity();
                BeanUtils.copyProperties(item,itm, "parentInvoice", "identifier");
                itm.setParentInvoice(kimeno);
                items.add(itm);
            }
            kimeno.setTetelekLista(items);
            return kimeno;
        }

    Erre valami tipp, hogy lehetne generikusabbá tenni? Pl hogy a "kimeno" típusa mondjuk bemeneti paramétertől függjön (de ne kelljen végig instanceofolgatni az összes lehetséges bemeneti osztályt), és amúgy extends AbstractInvoiceEntity.

    protected static <T extends AbstractInvoiceEntity> T getInvoiceEntity(AbstractInvoiceEntity originalEntity, Class<T extends AbstractInvoiceEntity> newClass) {
    T newInvoice = newClass.newInstance();
    (...)
    return newInvoice;
    }
    valami ilyesmi vagy átadsz egy factory-t, ami létrehozza a kívánt objektumot

  • togvau
    senior tag

    Mi baja lehet?
    SELECT new asd.dto.SzallitoiMegrendelesDTO(m.bizszam, AVG(tl.egysegAr), SUM(tl.mennyisegME1), SUM(tl.mennyisegME2), SUM(tl.mennyisegME3)) FROM Megrendeles m LEFT JOIN MegrendelesTetelek tl ON tl.parentInvoice=m WHERE tl.cikk... GROUP BY m.bizszam

    Sumokat szépen megcsinálja. AVG viszont 0.0 a DTO-ban, ahol double típusnak volt megadva a field, mert ha bigdecimalra állítom adok meg sír, hogy nincs konstruktor double-val. DB-ben decimal típusúak amiket átlagolnia kéne, és ha a DB-n lefuttatom a queryt sima SQL-ben, jó az átlag is. Az entity-ben is bigdecimal, mégse engedi az. Fura, mert a SUM-ok azok bigdecimalok, és engedi a dto-ban is a bigdecimalt. AVG-nél nem.

    meglett. Amikre igaz a feltétel, ott pont 0 az összes ár :D

  • mobal
    nagyúr

    Rá kellett jönnöm, hogy a spring data nem olyan okos, mint hittem, így ha a @Query-s repositoriy metódus szignatúrájában nem lista van, hanem pl string, akkor nem tol egy LIMIT 1-et a DB-felé, hanem működik amíg egy találat van, és exception amint több is van...
    Szóval hogy lehet korlátozni 1-re a találatok számát, natív query nélkül?
    Tényleg az a legegyszerűbb, hogy a service-ben csak kiveszem a lista első elemét? Tákolásra kényszerít?
    (metódusneves query leírás nem játszik, túl bonyolult ahhoz a query (pedig nem is igazán bonyolult))

    Hát pedig query-nél neked kell ezzel foglalkoznod szerintem: [link]

    Más, de Spring: tegnap migráltam SQL-ről Mongo-ra. Elég hamar ment szerencsére.

  • disy68
    aktív tag

    nem is akarok használni, de a példákban más megoldás nincs, lásd ott a fetch és mégse.
    Az elméleletet tudom, meg azt is, hogy az jpa-nál ritkán stimmel a gyakorlattal, ahogy itt se.

    A gyors megoldás az lett, hogy a service-ben nyomok egy gettert a sub entitykre semmibe vezetett eredménnyel, és utána már jó lesz a servicen kívül is.

    De inkább azt választottam, hogy a @Fetch(value = FetchMode.SUBSELECT)-et átírtam FetchMode.JOIN-ra. Hogy ez most bug, vagy feature, nem tudom, mindenesetre logikát nem látok benne... úgyhogy a bug a valószínűbb.
    Azt nem tudom mit csinál, nem is érdekel, ennek a rakás ürülék alkalmazásnak ez a legkisebb gondja :D

    ha a fetch mód subselect, akkor n db kapcsolódó entity-vel n+1 query-t generál a hibernate, ez működik eager és fetch betöltésnél is, viszont a join fetch mód esetében 1 db query-t generál a hibernate, amivel lekéri a kapcsolódó entity-ket is, így ez instant eager betöltést jelent fetch type-tól függetlenül

    én alapvetően a @NamedEntityGraph irányba mentem volna, ha nincs mód nagyobb refaktorra (bár ha ezt force-olja a projekt struktúra, akkor kb. mindegy, mert eager betöltés lesz a vége)

  • floatr
    veterán

    nem is akarok használni, de a példákban más megoldás nincs, lásd ott a fetch és mégse.
    Az elméleletet tudom, meg azt is, hogy az jpa-nál ritkán stimmel a gyakorlattal, ahogy itt se.

    A gyors megoldás az lett, hogy a service-ben nyomok egy gettert a sub entitykre semmibe vezetett eredménnyel, és utána már jó lesz a servicen kívül is.

    De inkább azt választottam, hogy a @Fetch(value = FetchMode.SUBSELECT)-et átírtam FetchMode.JOIN-ra. Hogy ez most bug, vagy feature, nem tudom, mindenesetre logikát nem látok benne... úgyhogy a bug a valószínűbb.
    Azt nem tudom mit csinál, nem is érdekel, ennek a rakás ürülék alkalmazásnak ez a legkisebb gondja :D

    A @Transactional többek között pont erre jó, hogy egyazon sessionbe kerül minden. Mondjuk eleve nem szeretem a metódus annotációkat, de nem hiszem, hogy az bezavarna.

  • disy68
    aktív tag

    LazyInitializationException-t hogy lehet megoldani, EAGER-re állítás nélkül?
    @Transactional ugye szokás szerint nem működik, a fő entity lekérdezése ugyan abban a @Transactional metódusban van, mint a subselectes getter hívása. Igaz, hogy nem is service layeren van, mert ez ugyan az a rakás... még mindig.

    @OneToMany(mappedBy="parentInvoice", fetch= FetchType.LAZY, cascade= CascadeType.ALL, orphanRemoval=true )
    @Fetch(value = FetchMode.SUBSELECT)
    public List<ItemsEntity> getItemList() {
    return itemList;
    }
    Már volt ilyen gondom, máshol, csak már nem tudom hol, csak arra emlékszem, hogy ott sem volt jó egyik dolog sem az EAGER-t leszámítva, amit a google kidob erre a hibára :), de sikerült EAGER nélkül valahogy.

    "ott sem volt jó egyik dolog sem az EAGER-t leszámítva, amit a google kidob erre a hibára"

    aham, mint ez meg ez, amikben kifejezetten azt írják, hogy ne használj eager-t ilyen helyzetben (első 2 találat)

    Vlad Mihalcea blogját amúgy tudom ajánlani, ha hibernate és/vagy jpa a témakör.

  • floatr
    veterán

    javax.persistence.schema-generation.scripts.action-nél nincs olyan, hogy update, pedig ha nem scriptet kell generálnia, olyan szép alter table-ket tud csinálni.
    Nem lehet kicsikarni belőle, hogy scriptbe rakjon update ddl-t? Nem akarok kézzel alter tablezni...

    Ez generál a stdout-ra scriptet, amit utána tudsz használni

    spring:
    jpa:
    hibernate:
    ddl-auto: update
    properties:
    hibernate:
    format_sql: true

    logging:
    level:
    org.hibernate:
    SQL: DEBUG
    type.descriptor.sql.BasicBinder: TRACE

  • floatr
    veterán

    Szeretnék egy két entity dolgot logolni, így beraktam az ős abstract entity-be, hogy

    @Transient
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    aztán random leszármazott entity-knél: java.lang.IllegalArgumentException: Could not resolve property name logger from Property set for bean

    Miért? Miért random, és hogy lehetne megcsinálni?

    Most ezt így nehezemre esik megszakérteni, de minden osztálynak saját loggere van. Ha nem akarod mindig beírni azt az 1-2 sort, akkor ott van a lombok logger annotációja

  • floatr
    veterán

    Van egy fieldem amiben az osztályom amiben generikusan másik osztály van, az abstract osztályban van deklarálva kell ennek a generikusban lévő osztály ősének metódusa, de a leszármazott osztályban már nem elég az őse, kellenek a fejlettebb metódusok is, de castolni nem tudom, nem engedi.
    Pl: nem optional az osztály, csak azzal tudom szemléltetni abstract class: protected Optional<AbstractOsztály> valami=new Optional<AbstractOsztály>();
    Leszármazott osztályban is használnám ezt Optional<LeszármazottAbstractOsztály> valami2= (Optional<LeszármazottAbstractOsztály) valami;

    De nem engedi. Mi a megoldás ha egy ták projektnél, egy abstractban view osztályban deklarált abstract osztályú field, subclassban kiterjesztett metódusait használhassam a a leszármazott view osztályban, felüldefiniálás nélkül?

    A generics kezelésnek kicsit nézzél utána, mert ez nem ilyen egyszerű. És tényleg mindenki jobban jár, ha egy kicsit érthetőbben fogalmazol, de ezt már mondtam korábban is.

  • Szmeby
    tag

    Van egy fieldem amiben az osztályom amiben generikusan másik osztály van, az abstract osztályban van deklarálva kell ennek a generikusban lévő osztály ősének metódusa, de a leszármazott osztályban már nem elég az őse, kellenek a fejlettebb metódusok is, de castolni nem tudom, nem engedi.
    Pl: nem optional az osztály, csak azzal tudom szemléltetni abstract class: protected Optional<AbstractOsztály> valami=new Optional<AbstractOsztály>();
    Leszármazott osztályban is használnám ezt Optional<LeszármazottAbstractOsztály> valami2= (Optional<LeszármazottAbstractOsztály) valami;

    De nem engedi. Mi a megoldás ha egy ták projektnél, egy abstractban view osztályban deklarált abstract osztályú field, subclassban kiterjesztett metódusait használhassam a a leszármazott view osztályban, felüldefiniálás nélkül?

    Kicsomagolod, castolod a belét, becsomagolod. Mondjuk, amit az Optional.map() csinál, ha már az Optional a példa.

    disclaimer: Remélem azt nem kell mondanom, hogy ha a kalapács nyelével akarod beverni a szöget, akkor ne csodálkozz, ha körülményes. Ha mondanom kell, akkor egy java software design témájú könyv elolvasása szerintem hasznos lenne. Valami a nagyoktól: Josh Bloch, Bob Martin, Kent Beck, Fowler, ...

    Ja igen, zavarbaejtően sok állítmány és szleng került a mondataidba, nem vagyok benne biztos, hogy jól értem a problémát, de van egy olyan érzésem, hogy máshogyan illene struktúrálni azt a kódot.

  • M_AND_Ms
    veterán

    közben meglett, picit máshogy: mvn package
    2 kérdés:
    -Kellene valami tool amivel teljes java projekteket lehet összehasonlítani, java fájlonként, tartalomra. Total commander synchronize dirs volt eddig, de most nem... minden java fájlt különbözőnek érzékel, és különbözik is a mérete byte-ra, de a tartalom nagyrésze egy az egyben ugyan az. By content checkbox nem segít, karakterkódolás pedig azonos, nincs fájl végi sortörés különbség sem :F

    -Van olyan tool amivel kigyűjhetőek, akár a pontosan egyező metódusok is? Mert az a szerencsétlen aki csinálta, még metóduson belül is 10 soros kódokat ismételget, azonos copy-paste metódusokból is sok van.
    Persze az is hasznos lenne, ha a feltűnően hasonló kódrészletekre is figyelmeztetne, hogy azt egységesíteni lehet.

  • floatr
    veterán

    ja. Az se ártana, ha a vaadinos css-t meg hasonlókat nem hagyná ki

    Pl így [link]
    Én mondjuk a gradle-t használom, annak van egy bootJar targetje

  • mobal
    nagyúr

    Hogy lehet egy springboot maven projektet jar-ba exportálni? A lehető legegyszerűbben kéne, amit elindítok eclipse-ben van intellij-ben, azt egy futtatható jar-ba

    fatJar-t akarsz asszemblálni ami standalone fut?

  • disy68
    aktív tag

    docker build-el. Valami maven wrappert írt, hogy be kell rakni a projektbe, az benn is van.
    Igen rákerestem, a java írja, hogy nem jó a jar. Pedig a hivatkozott jar még eredetiben simán indul, ugyan az alatt a 14-es jdk alatt.
    Megnéztem az argumentumot, de nem találja, mivel a docker linux fájlrendszerében keresi, nem az igaziban.

    "Valami maven wrappert írt, hogy be kell rakni a projektbe, az benn is van."

    docker-maven-plugin? hogy néz ki hozzá a konfig a pom.xml-ben?

    "Igen rákerestem, a java írja, hogy nem jó a jar."

    ha rákeresel a hibaüzenetre és hozzácsapod, hogy docker, akkor láthatod, hogy másoknak is volt ilyen problémájuk, a legtöbb esetben az argumentum átadással volt a gond, ami miatt a JAR_FILE változó értéke üres, így a copy nem fut le jól

    "Megnéztem az argumentumot, de nem találja, mivel a docker linux fájlrendszerében keresi, nem az igaziban."

    wut?

  • disy68
    aktív tag

    köszi, ez király dolog! Éreztem, hogy van valami ilyesmi :)

    dockeresíteném (próbából) az egyik sima springboot teszt cuccomat, amiben embedded H2 van.
    De ahogy egy régebbi node-os probálkozásomnál is, itt is egy soros semmit mondó hibaüzenettel száll el a run, de a build az rendben van mindig.
    Error: Invalid or corrupt jarfile /app.jar

    Ez a dockerfile
    FROM openjdk:14-jdk-alpine
    VOLUME /tmp
    ARG JAR_FILE
    ADD ${JAR_FILE} /target/wishlist-1.0-SNAPSHOT.jar 
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]

    Le van buildelve a jar, ott van a helyén a targetban.
    Még is. Amúgy ha arg-ot adnék meg azt, hol adjam meg? A formátumára vagyok kíváncsi.
    Amúgy egy vindózos gépen fut, de lásd a backslashek per jellé vannak alakítva.

    A docker image-et hogyan hozod létre? Használsz-e maven/gradle plugint? Rákerestél-e a hibaüzenetre? Nézted-e hogyan kell argumentumot használni a dokumentációban?

  • mobal
    nagyúr

    köszi, ez király dolog! Éreztem, hogy van valami ilyesmi :)

    dockeresíteném (próbából) az egyik sima springboot teszt cuccomat, amiben embedded H2 van.
    De ahogy egy régebbi node-os probálkozásomnál is, itt is egy soros semmit mondó hibaüzenettel száll el a run, de a build az rendben van mindig.
    Error: Invalid or corrupt jarfile /app.jar

    Ez a dockerfile
    FROM openjdk:14-jdk-alpine
    VOLUME /tmp
    ARG JAR_FILE
    ADD ${JAR_FILE} /target/wishlist-1.0-SNAPSHOT.jar 
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]

    Le van buildelve a jar, ott van a helyén a targetban.
    Még is. Amúgy ha arg-ot adnék meg azt, hol adjam meg? A formátumára vagyok kíváncsi.
    Amúgy egy vindózos gépen fut, de lásd a backslashek per jellé vannak alakítva.

    Ez Spring?

  • Superhun
    addikt

    spring nem tud véletlenül olyasmit, hogy az adatokat módosító, vagy létrehozó queryket követni lehet? Eseménynaplóhoz kellene, ahol a módosításokat kell logolni

  • floatr
    veterán

    felraktam. Erre a fos maven csesződött el.

    .7\vaadin-sass-compiler-0.9.13.jar (The system cannot find the file specified) ilyen hibák.

    update project, stb már megvolt.

    ha letörlöm, akkor megint jó

    Egy ideje ilyen esetekre VS Code konténert használok. Egy docker image-be összeállítja a fejlesztőkörnyezetet, amit utána tovább tudsz konfigolni.

  • mobal
    nagyúr

    Vindózon van egy openjdk 14, csak úgy kicsomagolva, hozzáadva a path-hoz, meg java_home beállítva.

    Tennék fel mellé egy 8-as JDK-t is, de nem tudok. Az openjdk elirányít az orákle oldalára, ha 8-ast keresek, ahol csak telepíthető van, ami valahogy kisajátít minden javas alkalmazást, és az futtatja, de hogy hogy, azt nem értem, mert a path-hoz, és javahome-hoz nem ad semmit.

    Linuxon meg csak simán az apt-al rakhatok fel 8-as, és legújabb javat is.

    Hogy lehet megoldani, hogy az elsődleges a 14-es openjdk legyen, de adott projekthez, aminek a pom-jában 1.8 van, ahhoz a 8-ast használja? És hogy telepítem? Tényleg 7zippel kell kihackelni az oracle telepítőből?

    Én már lassan két éve nem szórakozom csak ezt használom: [link]

  • mobal
    nagyúr

    nem. Az ugyan azt írja 20x, ahogy szokta, hogy nem talál megfelelő osztályt a szerializáláshoz (mert nincs is olyan félig összeszedett entity), de amúgy a json serializációig minden rendben, előtte kiíratom a visszaadott objektumot, onnan is látom, hogy spamet rak bele.

    Nagyon furán működik ez a spring data.

    pl van 2 entity, 1-1 kapcsolattal. Kellene nekem a "gyerek" összes infoja, a szülő id-ja alapján.
    @Query("SELECT p FROM UserProperties p INNER JOIN User u ON u.userProperties = p.id WHERE u.id=?1")
    @Query("SELECT u.userProperties FROM User u WHERE u.id=?1")
    2 queryt eredményez mindkettő, ahol összejoinolja ahogy az első queryben van, majd még egy query ahol a User-t lekérdezi ugyan olyan where-el... tehát 2x megcsinálja ugyan azt. Akár lazy, akár eager a kapcsolat. Akkor is megcsinálja, a user repository findbyid-t nyomok.

    Ok hogy id alapján történik minden, ami szinte ingyen van, de na... Tényleg csak natív queryvel lehet beleverni, hogy egy queryvel megcsinálja ezt? Vagy a spring show sql nem azt írja ki ami tényleg történik? Vagy el van cseszve a H2 driver?

    Ezt meg kéne tudni csinálni szerintem nativ query nélkül is. Régen csináltam hasonlót:

    Optional<Deck> findByIdAndGame_Id(int id, int gameId);

    A deck entity-nek pedig volt egy ilyen tulajdonsága:

    @OneToOne
    @JoinTable(
    name = "games_decks",
    joinColumns = @JoinColumn(name = "deck_id"),
    inverseJoinColumns = @JoinColumn(name = "game_id")
    )
    @JsonIgnore
    private Game game;

  • floatr
    veterán

    SELECT i.targetuser.id,i.id, i.targetuser.userProperties , i.interactiontime FROM Interaction i INNER JOIN Interaction it ON i.owneruser = it.targetuser WHERE i.owneruser.id = ?1 AND i.targetuser =it.owneruser

    Interaction entity User entitykre mutat, a userhez meg tartozik userproperties entity, 1-1 kapcsolatban.
    Itt a fenti kimenet kellene, csak 1 queryvel (mert ez 2-t eredményez, 1x ez a query, majd anyiszor userproperties query, ahány sor az eredmény.

    Ezt hogy lehetne 1 querybe rakni konkrétan? @Transactional nem használ, ha join fetchelni akarom a userpropertiest, mindig sír, hogy a parent object nincs a select listben, akkor is ha ott van (pl nem csak targetuser.id hanem targetuser).

    Ha most jobban végiggondolod, ezt SQL-ben sem lehet normálisan megcsinálni. SQL Server-nek van valami JSON-ös megoldása erre, de sosem használtam. Vagy egy nagy JOIN-ba pakolsz mindent, de akkor ismétlődés lesz, amit kézzel kell aggregálni stream-collector alapon, vagy külön kérdezed le, úgy viszont neked kell összekalapálnod az összetartozó adatokat, ha a lazy initet nem szereted.

    Igazság szerint, ha ilyen adatmodelled van, érdemes elgondolkodni egy NoSQL DB-n, mint pl. a Mongo.

    A H2/HSQL/Derby nem production-ready DBMS. Helyette inkább MySQL/MariaDB egy docker konténerben.

  • floatr
    veterán

    Ez a join fetch korlátoltság megkerülhetetlen? Csak akkor lehet használi join fetchet, ha fetchelt tábla szülője egészben ott van a select list-ben. Csakhogy nekem NEM KELL a teljes szülő, csak 1-2 field belőle...

    Egyrészt jó lenne, ha kicsit jobban leírnád a kérdéseidet, mert nem lehet követni, annyira csapongsz.
    A JOIN FETCH egy JPA specifikus dolog, a Spring Data nem tehet róla, hogy néha kell. Ha használsz @Transactional-t, vagy open session in view filtert, akkor egy tranzakción belül, több dolgot is fel tud szippantani, mint szeretnéd.
    Ha DTO-t használsz, akkor eleve máshogy fognak működni a dolgok.
    Ha csak bizonyos mezőket szeretnél használni, arra ott vannak az implicit és explicit projekciók.
    A fenti query a legtöbb DBMS-ben értelmezhetetlen.

  • Szmeby
    tag

    nem. Az ugyan azt írja 20x, ahogy szokta, hogy nem talál megfelelő osztályt a szerializáláshoz (mert nincs is olyan félig összeszedett entity), de amúgy a json serializációig minden rendben, előtte kiíratom a visszaadott objektumot, onnan is látom, hogy spamet rak bele.

    Nagyon furán működik ez a spring data.

    pl van 2 entity, 1-1 kapcsolattal. Kellene nekem a "gyerek" összes infoja, a szülő id-ja alapján.
    @Query("SELECT p FROM UserProperties p INNER JOIN User u ON u.userProperties = p.id WHERE u.id=?1")
    @Query("SELECT u.userProperties FROM User u WHERE u.id=?1")
    2 queryt eredményez mindkettő, ahol összejoinolja ahogy az első queryben van, majd még egy query ahol a User-t lekérdezi ugyan olyan where-el... tehát 2x megcsinálja ugyan azt. Akár lazy, akár eager a kapcsolat. Akkor is megcsinálja, a user repository findbyid-t nyomok.

    Ok hogy id alapján történik minden, ami szinte ingyen van, de na... Tényleg csak natív queryvel lehet beleverni, hogy egy queryvel megcsinálja ezt? Vagy a spring show sql nem azt írja ki ami tényleg történik? Vagy el van cseszve a H2 driver?

    "pl van 2 entity, 1-1 kapcsolattal."

    Na várj csak! Ha 1-1 kapcsolat van köztük, akkor miért OneToMany annotációt használsz? Mi történne, ha OneToOne-ra módosítanád?

  • Szmeby
    tag

    nem. Az ugyan azt írja 20x, ahogy szokta, hogy nem talál megfelelő osztályt a szerializáláshoz (mert nincs is olyan félig összeszedett entity), de amúgy a json serializációig minden rendben, előtte kiíratom a visszaadott objektumot, onnan is látom, hogy spamet rak bele.

    Nagyon furán működik ez a spring data.

    pl van 2 entity, 1-1 kapcsolattal. Kellene nekem a "gyerek" összes infoja, a szülő id-ja alapján.
    @Query("SELECT p FROM UserProperties p INNER JOIN User u ON u.userProperties = p.id WHERE u.id=?1")
    @Query("SELECT u.userProperties FROM User u WHERE u.id=?1")
    2 queryt eredményez mindkettő, ahol összejoinolja ahogy az első queryben van, majd még egy query ahol a User-t lekérdezi ugyan olyan where-el... tehát 2x megcsinálja ugyan azt. Akár lazy, akár eager a kapcsolat. Akkor is megcsinálja, a user repository findbyid-t nyomok.

    Ok hogy id alapján történik minden, ami szinte ingyen van, de na... Tényleg csak natív queryvel lehet beleverni, hogy egy queryvel megcsinálja ezt? Vagy a spring show sql nem azt írja ki ami tényleg történik? Vagy el van cseszve a H2 driver?

    Én inkább a Hibernate-re gyanakszom (vagyis az általad választott aktuális JPA implementációra), ő rakja össze az sql-t. A spring csak egy plusz réteget húz köré. Ezért is gondoltam azt, hogy az egyik megoldás egyből a hibernate-et szólítja meg, míg a másik átfolyik még néhány springes optimalizáción. Habár a spring egyik és másik modulja is képes gyökeresen eltérő "optimalizációkat" végrehajtani ugyanabból a kiindulópontból.

    Szerintem sem sikerültek a legjobbra a hibernate default működési módjai ilyen-olyan esetekben, de tudod, ez ízlés dolga. A kedvencem, hogy Set, List, Collection, stb típusok esetén ceteris paribus teljesen eltérő lekérdezéseket rak össze végül. Külön öröm volt ezt debugolni. :D
    Más fejlesztő más problémával meg örül neki, hogy pont úgy működik az általa összerakott izé, ahogy azt elvárja. A show_sql-nek nincs oka, hogy hazudjon.

    Megtanultam már, hogy minden hibernate által összeállított query-t le kell ellenőrizni, mert orbitális hülyeségeket, optimalizálatlan megoldásokat tud összerakni a háttérben. Vagy csak nekem vannak furcsa igényeim, ki tudja. :D

    Örülök, hogy a fetch megoldotta a problémát. :) Optimalizálj és jó lesz. :)

  • togvau
    senior tag

    nem. Az ugyan azt írja 20x, ahogy szokta, hogy nem talál megfelelő osztályt a szerializáláshoz (mert nincs is olyan félig összeszedett entity), de amúgy a json serializációig minden rendben, előtte kiíratom a visszaadott objektumot, onnan is látom, hogy spamet rak bele.

    Nagyon furán működik ez a spring data.

    pl van 2 entity, 1-1 kapcsolattal. Kellene nekem a "gyerek" összes infoja, a szülő id-ja alapján.
    @Query("SELECT p FROM UserProperties p INNER JOIN User u ON u.userProperties = p.id WHERE u.id=?1")
    @Query("SELECT u.userProperties FROM User u WHERE u.id=?1")
    2 queryt eredményez mindkettő, ahol összejoinolja ahogy az első queryben van, majd még egy query ahol a User-t lekérdezi ugyan olyan where-el... tehát 2x megcsinálja ugyan azt. Akár lazy, akár eager a kapcsolat. Akkor is megcsinálja, a user repository findbyid-t nyomok.

    Ok hogy id alapján történik minden, ami szinte ingyen van, de na... Tényleg csak natív queryvel lehet beleverni, hogy egy queryvel megcsinálja ezt? Vagy a spring show sql nem azt írja ki ami tényleg történik? Vagy el van cseszve a H2 driver?

    join fetch megoldotta a 2 querys dolgot... de ezt miért nem tudja magatól? Főleg a default gyári queryknél, mint a findbyid.

  • Szmeby
    tag

    Van egy Entity, aminek vannak al entity-jei, Set-ben. E set fölött ezek az annotációk vannak:
        @OneToMany(fetch = FetchType.LAZY, mappedBy ="user" )
        @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
        @JsonIdentityReference(alwaysAsId = true)
    Ez jól is működik, ha konkrétan ezt az entityt kérdezem le, spring data crudrepository findbyid-vel, szépen a set-ben lévő entityknek csak az id listáját adja vissza.

    De ha egy jpql query-ben van, ami egy DTO-t csinál, és annak az egyik tagja a fenti fő entity, akkor a @json annotációs gyerek entityknek visszaadja az id-jait, mellettük még másik fieldjét is, ami mellett egyébként még 2 van, amit meg nem ad vissza...

    Nem értem, hogy itt miért nem az id listát adja vissza, és azt sem, hogy miért csak azt az 1 fieldet adja vissza, mikor ott van még 2.

    Miért adja vissza ugyan azt az entityt 2 queryben teljesen különbözőképpen?

    Azért, mert a szoftverfejlesztés bizonyos területein nem ismerik a sztenderdizálás fogalmát. :)
    A debug logokkal sem jutottál közelebb a megoldáshoz?

  • floatr
    veterán

    belefutottam egy hasonlóba: https://stackoverflow.com/questions/47640698/com-fasterxml-jackson-databind-ser-beanserializer-serialize-spring-jpa

    Úgy tűnik, hogy ha rest-ben lekérdezett entity-ben van kapcsolat másik entity-vel (gazdájával), és ez oda vissza jelölve van (onetomany->manytoone), akkor jsonizáláskor végtelen ciklusba fut. Ezt megoldotta az, hogy a @Jsonignore-t raktam a gazda entity kapcsolat field-nél, így az egész gazda entity kimarad a visszaadott jsonből..

    De mi van, ha én szeretném a gazda entity id-ját (mást nem) is visszaadni rest-en? Tudom, saját DTO létrehozással, és query utáni oda-vissza konvertálásával lehetne. De nincs rá valami annotációs okosság?

    Belepakolsz egy @Transient annotációval jelölt metódust, ami get***Id néven visszaadja a kapcsolt entity azonosítóját.

    De használhatod a gyerek-szülő kapcsolatban a JsonManagedReference és JsonBackReference annotációkat is, ami csak egyik irányban engedi a szerializációt kifejteni

  • bambano
    titán

    ja így lett, openjdk 11 az elsődleges minden más azon fut, és teljes path-al 8-al van indítva ez az app

    környezeti változót beállítottad?

  • disy68
    aktív tag

    frissítettem linuxos kis szerveremen java-t 11-re. Az eddig java 8-on futó kis servlet most:
    Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet

    Nincs máven, és nem is szeretnék belemódosítani a jar-ba.
    Van rá megoldás azon kívül, hogy visszateszem a 8-at?

    "Runtime" is meg lehet adni további dependenciákat pl. a CLASSPATH környezeti változóban vagy -classpath kapcsolóval: link
    pl: java -classpath /path-to/servlet.jar MyApplication

  • Ezekiell
    veterán

    frissítettem linuxos kis szerveremen java-t 11-re. Az eddig java 8-on futó kis servlet most:
    Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet

    Nincs máven, és nem is szeretnék belemódosítani a jar-ba.
    Van rá megoldás azon kívül, hogy visszateszem a 8-at?

    Ha nem akarsz módosítani a Jaron, akkor vissza a java8, vagy adsz classpathot neki system envben. Vagy dockerben indítod java8al, és mehet a java11 a rendszerre.

  • mobal
    nagyúr

    megint szívás a keveréssel... spring MVC controller, JSF-el. Tökjó volt addig, amíg nem kéne egy jsf oldalt GET url paraméterrel megnyitni.
    De ott elakadtam:
      @GetMapping(path = "/public/list/{id}")
    public String publicwish(@PathVariable long id, Model model) {
       System.out.println("Controller:"+id);
       model.addAttribute("id", id);
          return "public/list.xhtml";
        }

    nem spring controllernél van az f:viewParam, de itt sehogy se működik. 1 darab id-t kellene csak a jsf managedbeannek eljuttatni, akárhogy. Ezt a model-t se tudom hogy lehetne elérni jsf-ből. A returnbe bármi mást írok, akkor 404 lesz. Így bejön az id a controllerhez, de a jsf-be nem megy tovább. Erre mi a megoldás?

    Najó találtam rá egy megoldást, de az igen csúnya :)

    A logikát pakold át @Service-be a kontrolleredből. Model helyett pedig dto-kat illik adni controllernek.

  • Superhun
    addikt

    nem túl fontos, csak optimalizációs kérdés:
    van egy jpql query, hogy pl: SELECT w FROM Stuff s JOIN User u ON s.owner_id=u.id WHERE u.id=?1
    De itt épp nem kellene semmi a User-ből, szükségtelen a join, az owner_id-re keresni a where-ben elég lenne.
    Tehát SELECT s FROM Stuff s WHERE s.owner_id=?1 de így elszáll, hogy nem találja az owner_id-t, pedig DB szinten van ilyen, csak entity-ben ugye User owner van.
    Ilyet így csak natív queryben lehet?
    Vagy ilyenkor a DB okosan egyszerűsít, és tudja, hogy a 2.-al kiváltható az első query?

    Próbálj ki valami ilyesmit:

    SELECT s FROM Stuff s WHERE s.owner.id = ?1

  • togvau
    senior tag

    Na beszívattam magam... már nagyon keveredtek a dolgok, nem akarom újraírni.
    Szóval spring MVC, security+JSF

    Működik minden, addig, hogy kellene az egyik jsf oldalon egy lekérdezés, ami az oldalt megnyitó belépett org.springframework.security.core.userdetails.User adatai alapján kérdez le.

    @Controller-ben tökegyszerű, csak egy @AuthenticationPrincipal MaiUserDetailz user paraméter kell a metódusba. De ez csak @Controller-ben használható, és nekem a @Service-ben kellene, vagy ha nincs rá más megoldás, akkor a jsf beanjének átadni valahogy.

    Erre valami ötlet?

    megvan. SecurityContextHolder.getContext().getAuthentication().getPrincipal() mindenhol műxik :)

  • Superhun
    addikt

    Teljesen mindegy melyik van ott, a hiba ugyan az, ugyan úgy működik, (egyébként @componentnél a spring kezeli, managedbeannél meg a javas beépített cucc ennyi a különbség)

    Látni kellene a kódot, hogy érdemben tudjunk segíteni.

  • Superhun
    addikt

    Ezt meg tudja nekem valaki magyarázni?

    JSF frontend, springboot-mvc-data backend. Júzer módosító felületen, egy @PostConstruct init metódus van, ami betölti a júzer listát, egy @Autowired @Service metódust hívva, ami Crudrepositoryt hív.

    Ez rendben is megy. Módosítok a felületen (jelszó változtatás), ami hasonlóképpen történik, de hogy a változások rögtön látszódjanak, a JSF managedbean (ami a spring miatt inkább @Component) metódusa ami a servicet meghívja, az újra meghívja az initet, ami szintén, csak a lekérdezést.

    Ez megint oké. De ha 2. alkalommal is módosítok valamit, akkor hibernate lazyinitialization exceptionnal elszáll, és mindig ugyan ez lesz ezen túl, ha reloadolom az oldalt, akkor is.
    Ha nem megyek el eddig a 2. módosításig, vagy előtte reloadolom az oldalt, nincs ilyen probléma. Akárhányszor nyomogathatom az újratöltést, annyiszor lekérdez, nincs lazy probléma.

    Mindegyik service metódus javax.transaction. @Transactional

    A furcsaság amit itt észrevettem, hogy az első módosítás utáni frissítésnél, ha a managedbean metódus hívja meg az initet, akkor csak a fő tábla selectje megy le, az ahhoz kapcsolódó entityké nem. De ha böngészőben reloadot nyomok, akkor kapcsolódókat is selecteli.
    Ugyan az a metódus 2 féle képpen működik? :F

    Ez az egész nekem nagyon nem kerek. Ezt a részt hogy érted? "JSF managedbean (ami a spring miatt inkább @Component)"
    A JSF managed beannek @ManagedBeannek kellene lennie, nem @Componentnek. JSF-et és Springet ilyen formában nem szabad keverni. Itt le van egy jó példa, hogy hogyan kellene a Spring+JSF-nek kinéznie: https://www.baeldung.com/spring-jsf

  • disy68
    aktív tag

    pl mvc.perform(MockMvcRequestBuilders.post("/user").header(HttpHeaders.AUTHORIZATION, "Bearer "+testToken).contentType(MediaType.APPLICATION_JSON_VALUE).content(json)).andReturn();
    így. Ha kihagyom az autentikációs tokent, akkor is megy. Úgy megy, hogy semmilyen jogosultsági beállítást nem állítottam a tesztben. Ugyan ennyivel elindítva postmanből szépen unauthorized, ahogy kell.

    A másik, pedig hogy a beadott DML sql-ben lévő insertek lefutnak még egyszer (constraintviolationnal, mert már ugye betöltötte a DB-be), amikor egy ahhoz köze nincs, rest hívást csinálok először. Utána újra próbálva ugyan az a rest hívás lemegy.
    Így an a DML beadva az application.properties-ben: @Transactional
     @PostMapping(path = "/user")
     @ResponseBody ResponseEntity<InfoResponse> createUser(@RequestBody UserDTO userDTO) {
      User newUser = new User(userDTO);
      return InfoResponse.createResponseEntity(ResponseTypes.SUCCESS, "new user id: "+userRepo.save(newUser).getId(),HttpStatus.CREATED);
     }

    Nem írsz arról, hogy a MockMvc-t hogyan használod (a test class hogyan van annotálva). Ha @SpringBootTest annotációval használod, akkor explicit be kell konfigurálni a security-t.
    részlet a korábbi baeldung cikkből:

    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    @Before
    public void setup() {
    mvc = MockMvcBuilders
    .webAppContextSetup(context)
    .apply(springSecurity())
    .build();
    }(...)

    De én továbbra is TestRestTemplate használatát javaslom, ehhez itt egy kis egyszerű minta.

    A DB-s problémád pedig kicsit zavaros, az az "application.properties" részlet meg egy controller post methodja..

    @(#11044) mobal
    nem unit csak jUnit :)

  • mobal
    nagyúr

    pontosan azt, amit írtam. De lefut az alkalmazás, elindul ugyan úgy mintha simán futtatnám, lefuttatja a teszteket, majd leállítja.

    És most az újabb dolog amit szeretnék el,érni, az az, hogy ne csaljon a springboot junit test, és ne god mode-ban hívja meg a rest szolgáltatásokat, hanem autentikálni kelljen, csak úgy mintha postmanból hívnám.

    Ez biztos unit tesz? Nekem már nem annak tűnik, ha autentikálni is akarsz.

  • disy68
    aktív tag

    pontosan azt, amit írtam. De lefut az alkalmazás, elindul ugyan úgy mintha simán futtatnám, lefuttatja a teszteket, majd leállítja.

    És most az újabb dolog amit szeretnék el,érni, az az, hogy ne csaljon a springboot junit test, és ne god mode-ban hívja meg a rest szolgáltatásokat, hanem autentikálni kelljen, csak úgy mintha postmanból hívnám.

    Ok, azt hiszem értem mi a félreértés. Ezt írtad: "maradjon futva a junit tesztek lefutása után". Ebből én unit testre asszociáltam és erről is beszéltem.

    Erősen kétlem, hogy támogatná bármilyen test framework alapból, hogy utána fusson tovább az alkalmazás, ami a tesztek futtatása miatt indult.

    A springboot junit test az meg nem csal, hanem azt csinálja, amit "mondasz" neki. Hogyan hívod most a tesztekben a "rest szolgáltatásokat"? Itt egy baeldung a témakörben. Meg egy TestRestTemplate részletesebb.

  • disy68
    aktív tag

    Hogy lehet elérni, hogy a springbootos app maradjon futva a junit tesztek lefutása után, ne lője le az egészet?
    Sőt az lenne a jó, hogy ha választhatnék, hogy indítsa el az egészet, vagy maradjon mindig futva az app, és akárhányszor újrafuttathatom a junit tesztet

    A unit test-eknek van valami futtató keretrendszere, ami segítségével futtatod a teszt osztályok metódusait, amiben használod az alkalmazásod elemeit. Ilyenkor nem fut a teljes alkalmazás, szóval nincs sok értelme így a kérdésnek. Mi a tényleges probléma, mit szeretnél elérni?

  • disy68
    aktív tag

    JPA-ban van arra automata lehetőség, hogy a fő entity, és a hozzá tartozó al-entity-ket egyszerre rakja a DB-be? Tehát van egy fő entity, amihez kapcsolódhat sok al-entity.
    Mert fő entity save-nél csak a fő entity elemeit menti le, a benne lévő al-entityket nem.
    Tényleg csak selectkor képes összeszedni mindent, máskor szájba kell rágni az egyértelműt?

    Cascade működést meg kell adnod. Itt van hozzá egy baeldung.

  • Drizzt
    nagyúr

    JPA-ban van arra automata lehetőség, hogy a fő entity, és a hozzá tartozó al-entity-ket egyszerre rakja a DB-be? Tehát van egy fő entity, amihez kapcsolódhat sok al-entity.
    Mert fő entity save-nél csak a fő entity elemeit menti le, a benne lévő al-entityket nem.
    Tényleg csak selectkor képes összeszedni mindent, máskor szájba kell rágni az egyértelműt?

    Cascade a funkcio amit keresel. Amugy altalaban nem annyira javasolt a hasznalata. Meg tudod adni egy tombben, hogy milyen muveleteket kaszkadoljon egy adott entitas objektumra, vagy entitas kollekciora.

  • floatr
    veterán

    Most kellett :)
    Linkeltem fent a bugot, ami valahol van... exception alapján spring data-ban van, de a workaround az egy criteriaquery, aminél nem jelentkezik ugyan az a bug:

    @Query("select p.id from Photo p where p.user = ?1")
    List<Long> findIdsByUserId(long id, boolean restricted);
    Ez elhasal, a linkelthez hasonló: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [34] did not match expected type... -al

    Míg ugyan az a lekérdezés (kicsit még kibővítve), criteriaqueryvel, ugyan olyan metódusparaméterekkel, fut ahogy kell:
     public List<Long> findIdsByUserId(long id, boolean restricted) {
      var cb= em.getCriteriaBuilder();
      var ids=cb.createQuery(Long.class);
      var root=ids.from(Photo.class);
      ids.select(cb.construct(Long.class, root.get("id")));
      var pred= new ArrayList<Predicate>();
      pred.add(cb.equal(root.get("user"), id));
      if (!restricted) pred.add(cb.equal(root.get("restricted"), false));
      ids.where(pred.toArray(new Predicate[pred.size()]));
      return em.createQuery(ids).getResultList();
     }

    fura. user= User entity kapcsolat, ami DB-ben egy BIGINT-et jelent user_id mezőben.

    Nézd nem mondom, hogy hibátlan a framework. Tele van apróbb hiányosságokkal, dokumentálatlan sok helyen, és a dobott hibák félrevezetőek.
    De ha alaposan ismered, nem csupán a tutorialokat bújod, akkor fel fogod ismerni az alapvető összefüggéseket. A fenti lazy init probléma nem bug. Így működik a JPA, és ha a @Transactional használata problémát okoz, akkor nagyon gyorsan igyekezz elsajátítani, mert mint mondtam: alap.

    Az iménti kódrészlettel van egy baromi nagy baj, nem is csupán a paraméterek száma miatt. A query, amit leírtál, egy JPQL SELECT. Annyiban különbözik az SQL-től, hogy objektumokat kezel (többek között). A p.user=?1 nem a táblában lévő oszlopra vonatkozik, hanem a Photo entitás user adattagjára, ami gondolom User típusú. A JPQL nem long értéket vár, hanem egy User objektumot. Helyesen így lenne:
    select p.id from Photo p where p.user.id = ?1
    feltételezve, hogy a user azonosítója az id nevű property, így lehetne Long paraméterrel hívni. A restricteddel az a baj, hogy feltételesen csapod a query-hez a criteria API-s implementációjával. Ilyet @Query annotációval nem lehet. Ott fixen meg kell adni a JPQL-t, amit nem módosíthatsz, magyarán:
    select p.id from Photo p where p.user.id = ?1 and p.restricted=?2
    lenne a végső JPQL (ha el nem néztem még valamit).

    Ne ess abba a hibába, hogy a frameworkben keresed a bugot, miközben helytelenül kódolsz.

  • Drizzt
    nagyúr

    Most kellett :)
    Linkeltem fent a bugot, ami valahol van... exception alapján spring data-ban van, de a workaround az egy criteriaquery, aminél nem jelentkezik ugyan az a bug:

    @Query("select p.id from Photo p where p.user = ?1")
    List<Long> findIdsByUserId(long id, boolean restricted);
    Ez elhasal, a linkelthez hasonló: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [34] did not match expected type... -al

    Míg ugyan az a lekérdezés (kicsit még kibővítve), criteriaqueryvel, ugyan olyan metódusparaméterekkel, fut ahogy kell:
     public List<Long> findIdsByUserId(long id, boolean restricted) {
      var cb= em.getCriteriaBuilder();
      var ids=cb.createQuery(Long.class);
      var root=ids.from(Photo.class);
      ids.select(cb.construct(Long.class, root.get("id")));
      var pred= new ArrayList<Predicate>();
      pred.add(cb.equal(root.get("user"), id));
      if (!restricted) pred.add(cb.equal(root.get("restricted"), false));
      ids.where(pred.toArray(new Predicate[pred.size()]));
      return em.createQuery(ids).getResultList();
     }

    fura. user= User entity kapcsolat, ami DB-ben egy BIGINT-et jelent user_id mezőben.

    Igy ranezesre: ket fuggveny parametered van, mig a querynek csak 1. A @Queryben jpql expression van. Ha a user id-jere akarsz szurni, akkor: where p.user.userId =?

  • floatr
    veterán

    Jaj de bonyolult, és csúnya. DeltaSpike-nál létre lehetett hozni interfacet extends EntityRepository, ahol csak @Query elég volt, ahol meg vegyesen kellett @query, és rendes metódus is, ott abstract class extends AbstractFullEntityRepository, aztán abstract metódusnál csak @query, nem abstractnál meg minden más.

    Vannak bajok ezzel a spring datával, belefutottam ebbe is [link], csak sima long-al. Akkor jön elő, ha entity kapcsolat van 2 tábla között. Bár a kapcsolat DB szinten sima id-kkel van meg (bigint-ek), id alapján queryben mégse lehet szűrni, mert bár a query paraméter long, ami jó a biginthez, de spring data azt már entity-nek látja, amivel nem stimmel a long...
    Akkor lehet választani, hogy vagy entity szintű kapcsolatok, vagy optimalizált lekérdezések... bár criteriaqueryvel nem próbáltam még.

    Relatív, hogy mi a csúnya :) van egy interface a Data metódusoknak, meg egy custom implementációhoz, már ha kell egyáltalán.

    Annyit azért nem árt fejben tartani, hogy a @Transactional alap. Nem hozunk létre tranzakciót kézzel, nem nyitunk db kapcsolatot. EntityManager-t a legvéső esetben szabad csak babrálni. Helyette érdemes a projekciókkal csinálni, amit lehet.

  • floatr
    veterán

    Köszi, így érthető!
    Manuálisan pedig entitymanager begintransactionnel lehet kezdeni, és flush-al lezárni?

    Ezt viszont megint nem értem:
    Ez volt: (működött az autowired)
    @Repository
    public interface PhotosRepo extends CrudRepository<Photo, Long> {

    Ez lett:
    @Repository
    public abstract class PhotosRepo implements CrudRepository<Photo, Long> {
     @PersistenceContext
     private EntityManager em;

    és mellé autowirednél:
    .NoSuchBeanDefinitionException: No qualifying bean of type 'org..asd.db.repository.PhotosRepo' available: expected at least 1 bean which qualifies as autowire candidate.
    Miért?

    Namost ez egy elég hosszú téma, de röviden itt van egy példa, ami alapján tudsz hozzácsapni összetetteb dolgokat egy JPA repo-hoz. Ezt most csak egy text editorban dobtam össze, de a lényeg itt van. Van egy JPA repository-d, amit a framework majd implementál magának. Kell egy új interface, amiben a saját új metódusaid vannak. Ezt implementálod egy külön osztályban, valamint az új interface-t hozzácsapod a JPA repo-hoz az extends-ben. Innentől kezdve a PhotosRepo típust injektálod be mindenhová, mert a Spring ez alapján készít saját implementációt.

    // létrehozol egy inteface-t a saját metódusaidnak
    public interface PhotosRepoCustom {...}

    // meghagyod a Spring Data repository-dat is, de hozzácsapod a saját interface-t is
    @Repository
    public interface PhotosRepo extends CrudRepository<Photo, Long>, PhotosRepoCustom {...}

    // implementálod az új interface-t
    public class PhotosRepositoryImpl implements PhotosRepoCustom {
        @PersistenceContext
        EntityManager em;
        public List<A> findAllCustom() {
            ....
        }
    }

    De a @Query annotációval használhatsz JOIN FETCH-et is egy query metódusban pl.:
    @Repository
    public interface PhotosRepo extends CrudRepository<Photo, Long> {
        ...
        @Query("SELECT a FROM A a INNER JOIN FETCH a.b b")
        public List<A> find();
    }

  • floatr
    veterán

    spring JPA tesztelgetés_
    Van egy junit teszt class, ahol az egyik tesztben létrehozok B entityt, amit egy A entitybe illesztek (onetoone, lazy, nem cascade kapcsolat), és save a repoval.
    Aztán, ha ezt le akarom kérdezni findAll-al az A entityket amihez ugye tartozik a B entity is, akkor exception: no session.
    Ha Cascade.ALL-on van akkor nincs hiba. Ahogy akkor sem, ha a lekérdezős metódus springes @Transactional.
    Nem értem, hogy hova tűnik a session? Mi köze egy független select-nek tranzakciókhoz?

    Amikor meghívod a lekérdezést a Repository metódusban, az elkér egy aktuális sessiont az EntityManager-től. Mivel lazy, azon a ponton nem oldja fel a hivatkozást, csak egy B proxy-t kap az A objektum. Amikor visszakapod A-t, a session már ment a lecsóba, és hiába hívod meg a gettert, a proxy már nem találja a session-t.
    Na többek között erre is való a @Transactional, mert megmondja az EntityManager-nek, hogy hol kezdődik a session lifecycle. Ha nincs @Transactional, akkor a Repository metódusban kéne inícializálni a lazy relációkat.

  • p76
    senior tag

    Egyébként ez cseles, mert Integer[] és minden egyéb objektummal tömbbel úgy működik ahogy gondoltad. Csak mivel List<int> nem lehet, primitív adattípusokkal nem müxik és a Java jobb híján berakja az int[]-et egy elemnek.

  • Drizzt
    nagyúr

    próbálom megérteni a streamek furcsaságait, de nem sikerül:
    Arrays.asList(asd).stream().forEach(System.out::println);
    Miért nem írja ki a lista tartalmát? Egy ref stringet ír ki, gondolom a stream-ét.
      for (int j : asd) {
       System.out.println(j);
      }
    A klasszikus foreach meg simán működik, ahogy kell.

    Miért?

    A streammel nincs baj, az Arrays.asListet használod rosszul. Az listát csinál a megadott tömb elemeiből. Jelen esetben egy egy elemű listád lesz, aminek az az egy eleme egy int[] lesz.

    int[] ints = new int[]{0, 1, 2, 3};
    Arrays.asList(ints).stream().forEach(System.out::println);
    Arrays.asList(1, 2, 3).stream().forEach(System.out::println);

    Arrays.stream(ints).forEach(System.out::println);

    Eredménye:

    [I@1218025c
    1
    2
    3
    0
    1
    2
    3

  • zmb668
    csendes tag

    Sajnos 8 év után újra web servicekkel, és soappel ver a sors. Van egy webservice kliensem, aminek a requestjére érkező response, kb 10 darabb " unmarshalling exception: ? "-t okoz.
    Hogy lehet a ?-et debugolni? Sajnos a ? cause nekem túl bőbeszédű, nem tudom melyik részét nézzem. Akkor rég úgy ment, hogy 654x újra és újra átnéztem mindent, majd újra... tényleg nem történt ezekben a borzalmakban fejlődés? Vagy van valami trükk?

    Ha bemasolnad a pontos stacktracet (beleertve a caused by reszeket is), - nyilvan kidobalva belole azokat a sorokat, amig a programodra utal - akkor talan tobbet lehetne mondani, de igy tippre karakterkodolasi hiba van.

  • Lortech
    addikt

    Sajnos 8 év után újra web servicekkel, és soappel ver a sors. Van egy webservice kliensem, aminek a requestjére érkező response, kb 10 darabb " unmarshalling exception: ? "-t okoz.
    Hogy lehet a ?-et debugolni? Sajnos a ? cause nekem túl bőbeszédű, nem tudom melyik részét nézzem. Akkor rég úgy ment, hogy 654x újra és újra átnéztem mindent, majd újra... tényleg nem történt ezekben a borzalmakban fejlődés? Vagy van valami trükk?

    Most tényleg kérdőjel van az exceptionben, vagy csak nem akartad leírni a konkrét hibát?
    Én először megnézném, hogy az adott requestre adott válasz érvényes-e a wsdl-re.
    Pl. Soapui megmondja a response-on jobb klikkre.
    Aztán leellenőrizném, hogy a wsdl nem változott-e időközben, ugyanazt a wsdl-t implementálja-e a végpont, mint amiből a kliens lett generálva (?).
    Ha már muszáj debuggolni, akkor IDE-ben be tudsz állítani exception breakpointot az exception típusra.

  • MrSealRD
    veterán

    wsdl van, és nem látszik eltérés, már amennyit ki lehet belőle nézni... mert a válasz állhat 1 értékből is, de akár végtelenből is, 10 féle adattal ami mind opcionális...

    Hát ha van public része a exceptionnek, akkor azt az 1-2 sort bedobhatod... Nekem legutóbb attól volt unmarshalling exception, hogy jött egy adatstruktúra amiben az egyik elem típusa date volt, és sima záró tag-et, küldtek érték nélkül. Na ezen totál eldobta magát... Először elkezdtem keresgélni, hogy hol tér el a séma, aztán végül ott volt benne, hogy nem tudta parseolni...nyilván mivel nem volt benne semmi.

  • MrSealRD
    veterán

    Sajnos 8 év után újra web servicekkel, és soappel ver a sors. Van egy webservice kliensem, aminek a requestjére érkező response, kb 10 darabb " unmarshalling exception: ? "-t okoz.
    Hogy lehet a ?-et debugolni? Sajnos a ? cause nekem túl bőbeszédű, nem tudom melyik részét nézzem. Akkor rég úgy ment, hogy 654x újra és újra átnéztem mindent, majd újra... tényleg nem történt ezekben a borzalmakban fejlődés? Vagy van valami trükk?

    Hát lehet én tudok valamit rosszul, de nálunk ha ilyen séma eltérés van, akkor az unmarshalling nagyjából kidobja, hogy hol volt gondja... De én visszalépnék egyet. WSDL+XSD-k elvileg ott vannak. Abból meg kiderül, hogy mi kötelező és mi opcionális.

  • emvy
    félisten

    Én ilyet még nem láttam, csak azt hogy mánágereknek van egy büfé-ruhatár szak mellé nagy arcuk, pszichopatikus jellemzőik, félinformációkból "a szomszéd józsitól aki ismeri a testvérének a főnökének a fiát aki ért hozzá" tájékozódva, a divatos technológiákat nyomják keresztük "ha mások szeretik, nem lehet rossz"

    Nem jo helyen dolgozol.

  • Aethelstone
    addikt

    Én ilyet még nem láttam, csak azt hogy mánágereknek van egy büfé-ruhatár szak mellé nagy arcuk, pszichopatikus jellemzőik, félinformációkból "a szomszéd józsitól aki ismeri a testvérének a főnökének a fiát aki ért hozzá" tájékozódva, a divatos technológiákat nyomják keresztük "ha mások szeretik, nem lehet rossz"

    Ez azért erős túlzás...

  • emvy
    félisten

    Minden jobban menne a világon, ha azok döntenének akik értenek hozzá, és nem valami közgázt végzett divatos öltönyös, ecsetfejű/vagy pacalarcú, prolisznobjárgánnyal járó fontoskodó nagyarc. Az államnál sincs szükség rájuk, hiszen ők nyúlják le a pénzt, a semmiért.

    En ugy latom, hogy a jol meno cegeknel a menedzserek ertenek a szakmahoz is -- jo esellyel maguk is onnan indultak. Egeszen meglepo lenne, ha egy kozgazdasz dontene a JSP meg az SPA kozott.

  • emvy
    félisten

    Mindenhol a mánáger találja ki (najó kivéve a kis fejlesztőcsapatokat ahol kb mindenki egyenrangú), mert ezzel tudja fenntartani a látszatot, hogy rá szükség van, és csinál is valamit a "csicskák" munkájának lefölözésén kívül :D Na és ők azok akik a divat szerint választanak.

    Menedzserek nelkul szerinted jobban mennenek a projektek?

  • floatr
    veterán

    igen, el kéne felejteni, mert elavult, nagyon régi dolog, és ahogy látom 9 év alatt minimális fejlődés jött össze, de maximális mennyiségű új bug. De sajnos sok helyen ragaszkodnak a régi dolgokhoz, mert a mánáger kitalálta.

    Meg kell mondani a menágernek, hogy vagy most invesztál bele fejlesztésekbe X összeget, vagy később 10X-et kárelhárításra, javításokra, tarthatatlan supportra, és exponenciálisan növekedő költségigényű change requestekre.

  • G.Zs.
    senior tag

    igen, el kéne felejteni, mert elavult, nagyon régi dolog, és ahogy látom 9 év alatt minimális fejlődés jött össze, de maximális mennyiségű új bug. De sajnos sok helyen ragaszkodnak a régi dolgokhoz, mert a mánáger kitalálta.

    Felejtsd el azt a ceget is ahol a manager talalja ki.. :)

  • Aethelstone
    addikt

    Egyszerűen, ha nem lett elküldve az adott jsf oldalon legalább 1x már form, akkor nem biggyeszti be az outputlink a servlet mapping /faces-ét az url-be, ha pedig már volt form küldve, akkor igen... szépen fejlődik visszafelé a dolog, 9 éve még ilyen probléma nem volt, bár akkor is sok jsf, és AS bug volt.

    Felejtsd el ezt a jsf témát....valami ajaxos frameworkkel sokkal többre mégy...

  • Lortech
    addikt

    Tudom milyen a userroles, azért írtam át org...akármi...database-re... csak lehet nem abban a fájlban ahol kéne. De éppen, hogy a standalone.xml-es gányolást akarom elkerülni, és valami projectben lévő xml-es megoldást használni, ami jbosshoz le van írva, de wildflyon úgy látszik már máshogy van, csak nincs leírva hogy, mert a normális dokumentáció az luxus...

    Bárcsak ejb meg jpa logint írhatnék... de jó dolog is programozni, és nem konfigurálgatni, és azt kutatni, hogy az ami volt konfiguráció az most nem az, de nincs sehol leírva hogy mi... De hát 20% programozás, 80% xml matatás(konfiguráció), és hogy hol kell elhelyezni, és hogy kéne kinéznie az xml-nek.

    Pedig a standalone/domain.xml-ben kell beállítanod a security domainedet. A security domain / realm az nem 1:1 egy alkalmazáshoz kapcsolt, hanem alkalmazások fölött álló koncepció. JAAS infrastruktúra és Java EE pedig nem ad standard megoldást arra, hogy hogyan kell az alkalmazáshoz security domaint rendelni. Ezért van az, hogy jboss-web.xml-ben kell megadni. Vagy standalone/domain.xml-ben default security domainnek beállítani.

    jboss-web konfiguráció itt van említve: [link]
    security subsystem pedig itt van leírva: [link]
    Ebből látszik, hogy a Database / DatabaseUsers modul a webes admin konzolon
    a org.jboss.security.auth.spi.DatabaseServerLoginModul-t jelenti.
    Tutorial: [link]

    Fontos, hogy wildfly 11-től elytron alrendszer van és önmagában kevés a fenti legacy konfiguráció.
    Migráció: [link]

  • Lortech
    addikt

    Találtam egy ilyet [link]
    Így tetszene, talán így nem lenne olyan szívás JAAS-t beállítani. De ez még jbossra van írva de itt nem írja hogy lenne ilyen "[domain_name]-jboss-beans.xml" a wildfly-ban.

    Na meg nekem adatbázisból dolgozó login modul kéne, de ha rákeresek wildflynál mindenhol azt írják, hogy code="Database" a jboss doc-ban meg egy ronda org.jboss.security.auth.spi.UsersRolesLoginModule-van, akkor gondolom wildflyban is hasonló kéne legyen nem?

    Az kéne, hogy a jsf oldalakhoz JAAS belépés után lehessen hozzáférni, valamelyikhez adminként, valamelyikhez nem adminként, és a belépés után a belépett userről tudjak valamit (legjobb egy user entity lenne, de ha van egy username már az alapján is lekérdezhető az entity).
    A JPA háttér a user entityket használja más táblákhoz kapcsolódva is, és a user entityből azonosítani is lehet mindent, de úgy látom jpa-s JAAS azonosítás nincs, csak sima jdbc, de az is jó lenne, csak hogy?

    Mert mindenféle összefüggéstelen egymásnak ellentmondó, ősrégi "tutorial" van erről...

    UsersRolesLoginModule az egy fapad login module, property fájl alapú, nem tud db-ből authentikálni.
    Amit én linkeltem, az direktben a datasource-on keresztül jdbc-zik, de simán lehet írni JPA alapú login module-t, írtam is már wildflyra, weblogicra.. Nem triviális, de nem is ördöngősség.
    Pl. csinálsz egy EJB szolgáltatást ami JPA-n keresztül elvégzi az authentikációhoz szükséges ellenőrzést. A loginmodule-ból pedig JNDI-n keresztül lookupolod az EJB-det. A loginmodule-t csomagolhatod az alkalmazásodhoz is, nem muszáj külön modulként telepíteni.
    Belépés után httpservletrequestből (JSF-ben facescontexten keresztül) elérhető a felhasználó a getUserPrincipal metódussal (getName normálisan a felhasználó nevét adja vissza), ezzel bekérdezhetsz az adatbázisodba. Van még isUserInRole is ugyanitt.

  • togvau
    senior tag

    Köszi, éééés működik az egyik összefüggős táblába adás már, egy @ManyToOne hozzáadásával. Ennyi kellett. De fura, mert a jpa tools entity-tábla generátor megtalálta enélkül is az összefüggéseket (mert FK-zot), és jól generálta a táblákat ehhez.

    A factoryt pedig már static singletonosítottam, és az entity manager is entitykezelő (session scoped) osztályonként singleton.

    Másik (szintén kapcsolatban lévő) táblánál, mivel nincs ID-nek való egyedi adat, ezért külön int id van definiálva, simán @GeneratedValue.
    De először is, egy hibernate_sequence nevű táblát keresve száll el, de a jpa tools sima sequence nevűt generál. Átneveztem, így elindítva már azon száll el, hogy ebben nincs next_val nevű oszlop IDENTITY stratégiával.
    Egyik módszer sem működik. Komolyan olyan buta a perzisztenciaréteg, hogy nem tud egy üres táblában mondjuk csak simán 0-val kezdeni, és mindenféle táblák kellenek neki?

    Meglett, <property name="hbm2ddl.auto" value="update"/> ennyi kellett a persistence.xml-be.
    Nagy haladás van, bár a jaas túl bonyolult, szerintem marad a saját autentikáció.

  • Lortech
    addikt

    És ezt a merget-t hova kell tenni?

    Mert így ugyan az a hiba. (getgod() konkrétan az adatbázisból kérdezi leg a god entity-t, ami egy user.
    EntityManager em= getFactory().createEntityManager();
    em.getTransaction().begin();
    Event evt= new Event(new Date(),em.merge(getGod()),event, success);
    em.persist(evt);
    em.getTransaction().commit();
    em.close();

    #9626 az még lehet más más állapotból volt, most username van, és amiatt sír, hogy "Unknown column 'username' in 'field list'"

    De érdekes, mert az events-ben nincs username, hanem username_username-t generál oda a jpa tools, ahogy az applicant osztályban is applicant van, és applicant_username-t generál az adatbázisba. A username az events-ben és az applicant entity-ben is igazából egy hivatkozás az XUser entity-re

    @Entity
    public class XUser implements Serializable {

    private String name;
    @Id
    private String username;
    private String password;
    private UsrType type;

    @Entity
    @Table(name="Events")
    public class Event implements Serializable {

    @Id
    private Date date;
    private XUser username;
    private String event;
    private boolean success;

    @Entity
    @Table(name="Applications")
    public class Application implements Serializable {
    @Id
    @GeneratedValue
    private int id;
    private XUser applicant;
    private float amount;
    private boolean approved;

    Lehet bugos a JPA Tools table from entities generátora?

    Szerk:
    kipróbáltam azt hogy stimmeljen pontosan a név, tehát

    @Entity
    @Table(name="Events")
    public class Event implements Serializable {

    @Id
    private Date date;
    @Column(name="USERNAME_USERNAME")
    private XUser username;
    private String event;
    private boolean success;

    De ez sem nyert:
    "Cannot add or update a child row: a foreign key constraint fails (`ulytestdb`.`events`, CONSTRAINT `FK_Events_USERNAME_USERNAME` FOREIGN KEY (`USERNAME_USERNAME`) REFERENCES `xuser` (`USERNAME`))

    Nem definiáltál az entitásaidba relációkat, legalábbis nem látszik. Anélkül nem nagyon fog menni és FK be fog utagni, meg nyilván generátor se fog tudni jó db sémát generálni így. Ajánlott olvasmány: JPA relációk, de úgy általában JPA.

    EntityManager em= getFactory().createEntityManager();
    em.getTransaction().begin();
    Event evt= new Event(new Date(),em.merge(getGod()),event, success);
    em.persist(evt);
    em.getTransaction().commit();
    em.close();

    Ezzel itt az (lehet) a baj, hogy amint lezárod az EntityManagert, az összes managed entitás példányod, amit a persistence contextben használtál, detached lesz. Ennek pedig az a következménye, hogy a még be nem töltött, lazy load relációk nem tudnak majd betöltődni, ill. az objektumok módosítása esetén nem lesznek automatikusan perzisztálva sem.

  • Aethelstone
    addikt

    Vannak így létrehozott adatbázis táblák, JPA entitykből:
    CREATE TABLE Applications (ID INTEGER NOT NULL, AMOUNT FLOAT, APPROVED TINYINT(1) default 0, APPLICANT_USERNAME VARCHAR(255), PRIMARY KEY (ID))
    CREATE TABLE Events (DATE DATETIME NOT NULL, EVENT VARCHAR(255), SUCCESS TINYINT(1) default 0, USER_USERNAME VARCHAR(255), PRIMARY KEY (DATE))
    CREATE TABLE XUSER (USERNAME VARCHAR(255) NOT NULL, NAME VARCHAR(255), PASSWORD VARCHAR(255), TYPE INTEGER, PRIMARY KEY (USERNAME))
    ALTER TABLE Applications ADD CONSTRAINT FK_Applications_APPLICANT_USERNAME FOREIGN KEY (APPLICANT_USERNAME) REFERENCES XUSER (USERNAME)
    ALTER TABLE Events ADD CONSTRAINT FK_Events_USER_USERNAME FOREIGN KEY (USER_USERNAME) REFERENCES XUSER (USERNAME)
    CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(38), PRIMARY KEY (SEQ_NAME))
    INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0)

    Xuser létrehozása megy, de eventet már nem lehet, mert: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'user' in 'field list'

    Akkor is ezt dobja, ha az eventben lévő user példányt létrehozom, és az megy az event entity-be, de akkor is ugyan az, ha konkrétan a JPA-s lekérdezésből jött user példány van az eventbe irányítva.

    Ez mitől van? Hogy lehet a wildfly hibernate-jének a végső SQL parancsait kiirattatni mondjuk a konzolra? Az lehet segítene a hiba keresésben.

    Mondjuk egyik fizikai tábládban sem látok 'user' mezőt.

  • Lortech
    addikt

    És ez mit jelent hogy rossz az entity db mappingem? Az entitykből lettek generálva a táblák.

    Egyébként most megcsináltam fordítva, a meglévő táblákból generáltam az entityket, így kiegészült pár mappedby-al, meg onetomany, meg manytone annotációval, 2 user hozzáadás ment, bár event akkor is "detached entity passed to persist", de aztán már a user hozzáadás is ugyan ez. Most már generálni sem tudok az entitykből táblát, mert az meg más exceptionnel száll el.
    Szóval állítom vissza az ezelőtt mentett workspacet...

    Azt értettem alatta, hogy az entitásban/db-ben a probléma mezőt/oszlopot nem jól definiáltad.
    Pl. nem jó oszlopnevet adtál meg.
    Detached entity passed to persistnek számos oka lehet. Kézzel állítasz be kulcs mezőket mentés előtt? Másodjára persisttel már nem fog menni, mert már létezik adott kulcsú mező, viszont az entity detached állapotban van, mivel még a persistence contextedbe nem töltődött be (pl. merge-dzsel tudod manageddé tenni). Látatlanban okosabbat nem tudok mondani.

  • Lortech
    addikt

    Vannak így létrehozott adatbázis táblák, JPA entitykből:
    CREATE TABLE Applications (ID INTEGER NOT NULL, AMOUNT FLOAT, APPROVED TINYINT(1) default 0, APPLICANT_USERNAME VARCHAR(255), PRIMARY KEY (ID))
    CREATE TABLE Events (DATE DATETIME NOT NULL, EVENT VARCHAR(255), SUCCESS TINYINT(1) default 0, USER_USERNAME VARCHAR(255), PRIMARY KEY (DATE))
    CREATE TABLE XUSER (USERNAME VARCHAR(255) NOT NULL, NAME VARCHAR(255), PASSWORD VARCHAR(255), TYPE INTEGER, PRIMARY KEY (USERNAME))
    ALTER TABLE Applications ADD CONSTRAINT FK_Applications_APPLICANT_USERNAME FOREIGN KEY (APPLICANT_USERNAME) REFERENCES XUSER (USERNAME)
    ALTER TABLE Events ADD CONSTRAINT FK_Events_USER_USERNAME FOREIGN KEY (USER_USERNAME) REFERENCES XUSER (USERNAME)
    CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(38), PRIMARY KEY (SEQ_NAME))
    INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0)

    Xuser létrehozása megy, de eventet már nem lehet, mert: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'user' in 'field list'

    Akkor is ezt dobja, ha az eventben lévő user példányt létrehozom, és az megy az event entity-be, de akkor is ugyan az, ha konkrétan a JPA-s lekérdezésből jött user példány van az eventbe irányítva.

    Ez mitől van? Hogy lehet a wildfly hibernate-jének a végső SQL parancsait kiirattatni mondjuk a konzolra? Az lehet segítene a hiba keresésben.

    Valószínűleg rossz az entity-db mappinged, de ez abból amit írtál, nem látszik.
    Logolás: org.hibernate (vagy specifikusabb) kategóriára fel kell venni egy loggert és hozzá egy handlert:
    [link]
    Jboss logging teljesen oké, nem kell log4j vagy egyéb implementáció.

  • Lortech
    addikt

    WARN [org.hibernate.jpa.internal.EntityManagerFactoryRegistry] (default task-3) HHH000436: Entity manager factory name (provajder) is already registered. If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'

    Ha @ManagedBean(name="AnnoTestAdd")
    @RequestScoped
    public class TestAdd {
    private EntityManagerFactory factory= Persistence.createEntityManagerFactory("Ulyprov");
    private String username;
    private String name;
    ....

    Semmi sem történik a JSF-ből való metódushívásra (semmi üzenet), ha:

    @ManagedBean(name="AnnoTestAdd")
    @RequestScoped
    public class TestAdd {
    private static final EntityManagerFactory factory= Persistence.createEntityManagerFactory("Ulyprov");
    private String username;
    private String name;

    És akkor sem történik semmi ha applicationscoped-re változtatom.

    (most már jól emlékszem hogy régen is 10% volt a programozás, 90% a keretrendszerek lelki világának, és bugjainak a kitesztelése :) )

    És mindez azért történik, mert <h:selectOneMenu value="#{AnnoTestAdd.type}">
    <f:selectItems value="#{AnnoTestAdd.type}"/>
    </h:selectOneMenu>

    Ha ez nincs, működik. :F ez még is mi a....?

    Na ez az az irány, amit nem kéne erőltetni.
    Javaslom, szervezd EJB-be az üzleti logikádat és az adathozzáférést, és azt injektáld a JSF managed beanbe. Mert az nem arra való, hogy direktben JPA-zz és tranzakciót kezelj benne.
    AZ EJB-be pedig injektáld az entitymanageredet pl. az általam fentebb írd módon. Így nem kell foglalkoznod az entitymanager létrehozásával, életciklusával (pl. hogy többször létrehozod a factory-t, mint ahogy tetted).
    BalusC tutorialjait, megoldásait érdemes olvasni, ő jó forrása a JSF-fel kapcsolatos megoldásoknak: [link]

    JAAS-hoz: a login-config.xml az jboss szerinti leíró, wildfly-on máshogy néz ki.
    wildfly login module pl (standalone.xml vagy domain.xml megfelelő profiljában):

    <security-domain name="xysecdomain">
    <authentication>
    <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
    <module-option name="dsJndiName" value="ds jdni név"/>
    ... többi opció ...
    </login-module>
    </authentication>
    </security-domain>

    De mindez megtehető webes admin konzolból is.
    Aztán jboss-web.xml-ben kell egy <security-domain>xysecdomain</security-domain> hivatkozás, ami a webalkalmazásodat összekapcsolja a security domainnel wildfly-ban.

    selectItem vs enum passz, szerencsére már rég JSF-eztem.

  • Lortech
    addikt

    Köszi, közben rájöttem, hogy egyszerűen a createEntityManagerFactory paramétere rossz providerre mutatott, mert 8 éve jpaztam utoljára, és a kódrészlet amiből kicopyztam ugyan azt az azonosítót használta több dologra... így meg is lett a kavarodás.

    Libeket majd utólag rendezem. Meg megpróbálok minél többet annotációba tenni, ha már egyre többet lehet. Én még a 454676 darab xml-be írogatós időszakba jpa jsf-eztem :)
    De a jaas... az még mindig sötét, ugyan abból az adatbázisból kellene dolgoznia mint a JPA... de hogy?

    Wildfly picketboxot használ jaasra, van olyan login module, hogy
    DatabaseServerLoginModule.
    Meg lehet adni neki datasource-ot paraméterként és jdbc-vel hozzáfog férni a db-dhez. Nem tudom, friss-e a leírás, de bele lehet nézni a login module forrásába.

  • Lortech
    addikt

    Ok, rájöttem, hiányzott a form keret :) De most jött a "No Persistence provider for EntityManager named".

    Mit írjak a persistence-be a provider helyre? Csak hibernate-s provider stringeket találok ha ráguglizok, de nem működik. Vagy milyen JPA implementációt használ ez a wildfly?

    Eclipse data source-ként be van állítva, de gondolom az egy másik rendszer rendszerének a rendszere, és nincs átjárás :)

    Kézzel úgy tudtad feloldani helyesen a jsf-et, hogy a wildfly-odban lévő verziót (az appszerverben lévő verzióval pontosan megegyező) adtad hozzá, bármely más jsf lib hozzáadása lehet, hogy elfedi a hibaüzenetet, de problémát okozhat (és semmiképp se csomagold bele az elkészült artifactodba függőségként)

    Hibernate a jpa implementáció wildflyban. Provider helyére: org.hibernate.ejb.HibernatePersistence kell.

    A Wildfly szervereden definiálsz egy datasource-ot (standalone/domain.xml-ben kézzel ;], vagy jboss-cli-ben vagy webes admin konzolon), majd a persistence.xml-ben (ear-ban META-INF könyvtárba, war-ban WEB-INF/classes/META-INF könyvtárba) beállítod a datasource-ot.

    <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
    http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
    version="2.1">
    <persistence-unit name="mysqlpu" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasources/mysqlds</jta-data-source>
    <properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
    </properties>
    </persistence-unit>
    </persistence>

    Ezután a managed beanekből már tudod injektálni az em-et:
    @PersistenceContext(unitName = "mysqlpu")
    protected EntityManager em;

  • togvau
    senior tag

    Már megoldottam (kézzel), volt 2 perc. Most a JAAS-al küzdök, a jsf oldalak authentikációját kéne megcsinálni vele, de ahány leírás róla, annyi egymásnak ellent mondó beállítás van. Úgy tűnik az nem megy hogy honnan szedje az adatokat (jelszó, role).

    Na meg wildfly-on futtatott jsf egyszerű gombja aminek futtatnia kéne egy metódust, nem csinál semmit. Belöki az oldalt, klikk rá, és semmi. Konzolon sem, debug módban sem, semmit sem ír a szerver, meg más sem.

    Ok, rájöttem, hiányzott a form keret :) De most jött a "No Persistence provider for EntityManager named".

    Mit írjak a persistence-be a provider helyre? Csak hibernate-s provider stringeket találok ha ráguglizok, de nem működik. Vagy milyen JPA implementációt használ ez a wildfly?

    Eclipse data source-ként be van állítva, de gondolom az egy másik rendszer rendszerének a rendszere, és nincs átjárás :)

  • Lortech
    addikt

    <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
    <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

    Eclipse: Can not find the tag library descriptor for "http://java.sun.com/jsf/core"

    Mi baja? Wildfly-ra van bekonfigolva, runtime provided library-ra.

    Egyébként manapság mi a célszerűen használandó dátum-idő osztály? Adatbázisban lesz eltárolva. Jó az öreg java.util.Date?

    Húzd be a wildfly jsf függőséget (wildfly 11.0.0 verziót feltételezve):

    <dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-jsf</artifactId>
    <version>11.0.0.Final</version>
    </dependency>

    Vagy telepíts jboss tools az eclipse-edbe, és add hozzá a runtime-ot.

  • Retekegér
    MODERÁTOR

    <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
    <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

    Eclipse: Can not find the tag library descriptor for "http://java.sun.com/jsf/core"

    Mi baja? Wildfly-ra van bekonfigolva, runtime provided library-ra.

    Egyébként manapság mi a célszerűen használandó dátum-idő osztály? Adatbázisban lesz eltárolva. Jó az öreg java.util.Date?

  • mobal
    nagyúr

    <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
    <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

    Eclipse: Can not find the tag library descriptor for "http://java.sun.com/jsf/core"

    Mi baja? Wildfly-ra van bekonfigolva, runtime provided library-ra.

    Egyébként manapság mi a célszerűen használandó dátum-idő osztály? Adatbázisban lesz eltárolva. Jó az öreg java.util.Date?

    A "jó öreg" 1.8 óta tök új.

  • mobal
    nagyúr

    Nem a maven a bloatware, hanem a többi. A maven csak felesleges faxni. Igen, hibamentesebb, és profibb a kézi, de főleg gyorsabb :)
    Soha sem bírtam a divatos dolgokat, úgy is néhány év múlva a "maven fúj"/"spring fúj"/"akármi fúj" mert jön egy újabb divatos tool, amit kovács géza mánáger aki a fősulin dreamweawerrel összekattintott egy html oldalt, megmondja(előírja) :D Hát a cégeknél még arra sincs fantázia hogy saját interjúkérdést kitaláljanak, a nemzetközi divatot követi mind (hashtable keresztkérdések).

    "Nem a maven a bloatware, hanem a többi. A maven csak felesleges faxni."

    Ez a mondatod után kérlek fejezd be te és a többiek is ezt a témát. Nem lesz egyetértés csak felesleges feszültség keltés.

    Ez mindenkinek szól, nem akarok törölgetni.

  • floatr
    veterán

    Nem a maven a bloatware, hanem a többi. A maven csak felesleges faxni. Igen, hibamentesebb, és profibb a kézi, de főleg gyorsabb :)
    Soha sem bírtam a divatos dolgokat, úgy is néhány év múlva a "maven fúj"/"spring fúj"/"akármi fúj" mert jön egy újabb divatos tool, amit kovács géza mánáger aki a fősulin dreamweawerrel összekattintott egy html oldalt, megmondja(előírja) :D Hát a cégeknél még arra sincs fantázia hogy saját interjúkérdést kitaláljanak, a nemzetközi divatot követi mind (hashtable keresztkérdések).

    Szóval JSF, JPA meg mysql... A JPA nem bloatware? Az igazi profik JSP-ből SQLeznek direkt connectionökkel. Minek ez a nagy felhajtás a frameworkökkel?!

    Kissé odaver ez a vélemény minden fejlesztési metodikának. Hidd el, nem poénból találták ki őket, egyszerűen csak az a gond, hogy a szoftverfejlesztések kis százaléka szól arról, hogy van egy tetszőlegesen kis scope, azt lefejleszted, aztán felejtős. Az igények változnak, a kódbázis nő, újabb modulokra van szükség, integrálni kell más rendszerekkel... és itt jön a cost of change görbe, ami egy ilyen hozzáállással pár lépés után az egekbe szökik. Az a vicc, hogy erre már a PHP Group is régen rájött

  • Cathfaern
    nagyúr

    Nem a maven a bloatware, hanem a többi. A maven csak felesleges faxni. Igen, hibamentesebb, és profibb a kézi, de főleg gyorsabb :)
    Soha sem bírtam a divatos dolgokat, úgy is néhány év múlva a "maven fúj"/"spring fúj"/"akármi fúj" mert jön egy újabb divatos tool, amit kovács géza mánáger aki a fősulin dreamweawerrel összekattintott egy html oldalt, megmondja(előírja) :D Hát a cégeknél még arra sincs fantázia hogy saját interjúkérdést kitaláljanak, a nemzetközi divatot követi mind (hashtable keresztkérdések).

    Én igazából azt nem értem, hogy ha ilyen hozzáállással tolod, akkor miért javázol. Ehhez a lightweight vonalhoz más nyelvek sokkal jobban illenének, a java nem erről szól.

  • Aethelstone
    addikt

    Nem a maven a bloatware, hanem a többi. A maven csak felesleges faxni. Igen, hibamentesebb, és profibb a kézi, de főleg gyorsabb :)
    Soha sem bírtam a divatos dolgokat, úgy is néhány év múlva a "maven fúj"/"spring fúj"/"akármi fúj" mert jön egy újabb divatos tool, amit kovács géza mánáger aki a fősulin dreamweawerrel összekattintott egy html oldalt, megmondja(előírja) :D Hát a cégeknél még arra sincs fantázia hogy saját interjúkérdést kitaláljanak, a nemzetközi divatot követi mind (hashtable keresztkérdések).

    Azt hittem, hogy az ilyen arcok, mint Te, már rég kihaltak...szórakoztató olvasni a gondolataid :D

  • Lortech
    addikt

    De azért, büszke vagyok rá, hogy lightweight, kompakt cuccokat tudok összehozni, amit egy másolás után lehet is indítani anélkül hogy egy 6 terabyte-os vinyót megtöltenénk keretrendszerrel, meg a keretrendszer keretrendszerével, és a keretrendszer keretrendszerének a keretrendszerének a függőségkezelő keretrendszerével, amivel lehet a végső keretrendszert keretrendszerelni :D De sajnos a divat nem erre visz :( hanem hogy "vegyééé új gépet azon menni fog így is"

    A maven nem bloatware, a Javás világ jelentős része használja, nem azért, hogy szívassa magát, hanem hogy megkönnyítse vele a saját életét.
    Az elkészült artifactok méretét nem befolyásolja érdemben (opcionális maven leírókat leszámítva), hogy mavent használsz, ellenben 2 perc alatt lehet egy működő webalkalmazás vázad egy megfelelő archetípusból generálva, ami azonnal telepíthető, war/ear release-t készít. Sőt 1 perc bekonfigurálni egy maven plugint, ami deployol is neked a wildflyra. Csak érteni kell hozzá.
    De a te kézzel összevadászott librarys gányolásod biztos gyorsabb, hibamentesebb, profibb lesz.

  • cucka
    addikt

    De azért, büszke vagyok rá, hogy lightweight, kompakt cuccokat tudok összehozni, amit egy másolás után lehet is indítani anélkül hogy egy 6 terabyte-os vinyót megtöltenénk keretrendszerrel, meg a keretrendszer keretrendszerével, és a keretrendszer keretrendszerének a keretrendszerének a függőségkezelő keretrendszerével, amivel lehet a végső keretrendszert keretrendszerelni :D De sajnos a divat nem erre visz :( hanem hogy "vegyééé új gépet azon menni fog így is"

    Amire itt vered a melled, az pusztán annyi, hogy eddig csak sufniprojekteket láttál, ahol 1-2 ember összekalapál valamit és a deployment annyiból áll hogy felmásolod a gépre a pendriveról.
    Egy normális méretű projekten fel sem merül ilyen kérdés, hogy mennyi diszket foglal a keretrendszer.
    Ha ez egy létező probléma lenne, akkor mondjuk össze kéne trombitáljak két senior arcot, hogy megbeszéljük a problémát és kitaláljunk egy megoldást. Egy ilyen egy órás meeting költsége órabérben kiszámolva drágább lenne, mint egyszerűen csak venni egy nagyobb diszket.

    De na, majd ha egyszer olyan cuccokon dolgozol, ahol egy tucat fejelsztő dolgozik ugyanazon a kódbázison és az alkalmazást 10-15 évig karban kell majd tartani és továbbfejleszteni, akkor majd olvasd ezt visssza és röhögj magadon hogy mekkora amatőr voltál..

  • Taoharcos
    aktív tag

    De azért, büszke vagyok rá, hogy lightweight, kompakt cuccokat tudok összehozni, amit egy másolás után lehet is indítani anélkül hogy egy 6 terabyte-os vinyót megtöltenénk keretrendszerrel, meg a keretrendszer keretrendszerével, és a keretrendszer keretrendszerének a keretrendszerének a függőségkezelő keretrendszerével, amivel lehet a végső keretrendszert keretrendszerelni :D De sajnos a divat nem erre visz :( hanem hogy "vegyééé új gépet azon menni fog így is"

    Akkor te most assemblyben programozól, vagy már rögtön gépi kódot írsz? :D

Új hozzászólás Aktív témák

Hirdetés