Sziasztok!
Glassfish (4.1) alatt szereznék JSON-B-t használni de a következő hibaüzenetet kapom:
java.lang.NoSuchMethodError: javax.json.stream.JsonGenerator.writeKey(Ljava/lang/String;)Ljavax/json/stream/JsonGenerator;
A http://json-b.net/users-guide.html oldalon leírt lib-ek (vagyis azok legfrisebb verziói) a GF lib könyvtárában vannak ennek ellenére jön az üzenet.
Mi lehet a gond?
- 1008 megtekintés
Hozzászólások
Azon libeknek is lehet függősége, azt ellenőrizted, hogy az rendben van? Ugyanis a JSON-B specifikációban nincs fent említett osztály meg metódus.
Ez az osztály és ez a kivétel a Java EE 7-ben lévő
Bár akkor ClassNotFoundException lenne az eredmény, amikor nem tudja betölteni a JsonGenerator osztályt.
Az általad említett API a JSR 374-hez (Java API for JSON Processing) tartozik. Ennek a libnek esetleg más verziója (azaz 1.1-nél régebbi) megtalálható még a GF lib mappájában?
Mert akkor az történik, hogy az abban lévő javax.json.stream.JsonGenerator osztály töltődik be, amiben simán hiányozhat ez a metódus.
A JSON-P 1.0-s verziója a JSR 353-ban lett specifikálva, ami a Java EE 7 része.
És a JSR 353 szerint ebben az osztályban nincs is a hivatkozott metódus:
https://docs.oracle.com/javaee/7/api/javax/json/stream/JsonGenerator.ht…
Azaz a probléma a következő:
A GlassFish 4.1 az a Java EE 7 referencia-implementációja. Tartalmazza a JSR 353 szerinti JSON-P API-t (JSON-P 1.0), viszont a JSON-B használatához a JSR 374 szerinti JSON-P API kell (JSON-P 1.1).
A rendes megoldás az lenne, hogy a WAR-odba csomagolod a JSON-P 1.1-es API-t és implementációt.
- A hozzászóláshoz be kell jelentkezni
A
glassfish4/glassfish/modules/javas.json.jar
libet eltávolítottam, a JASON-B libjeit pedig a
glassfish4/glassfish/lib
könyvtárba bemásoltam és így működik a dolog.
- A hozzászóláshoz be kell jelentkezni
A véleményem szerint ilyet soha ne csinálj.
A Glassfish/Wildfly/WebSpgere és hasonló alkalmazásszerverek implementálnak egy jól definiált API halmazt, amelyet biztosítanak az alkalnazások felé. Ez a lib mappa erre való: az alkalmazásszerver által implementált API-k helye, semmi másra. Minden más függőség helye a WAR/EAR/RAR, pont az izoláció miatt. Amikor programozod a WAR-odat, ne fejlessz úgy, hogy a szabványnál többet vársz el a runtime-tól, nem lesz hordozható a kódod. Mindennek, ami a szabványon felül van, annak az alkalmazásodban van a helye, és ne úgy oldd meg, hogy módosítod az alkalmazásszervert.
- A hozzászóláshoz be kell jelentkezni
Nem szándékozom ilyet tenni, csak egy kísérlet volt annak kiderítése érdekében, hogy mi is lehet a gond.
- A hozzászóláshoz be kell jelentkezni
Írtam, hogy classloading issue van, más verziójú JsonGenerator töltődik be (az 1.0, mivel az van a Java EE 7-ben), mint ami neked kell (1.1, ami nincs a Java EE 7-ben).
Attól, hogy a GlassFish libek között ott van a javas.json.jar, még nem jelenti azt, hogy az a verzió van ott, ami neked kell futásidőben.
- A hozzászóláshoz be kell jelentkezni
Nem lehet, hogy belecsomagoltál valamit a war-ba, ami felülcsapja?
Egyébként meg itt is megér egy kérdést: https://www.facebook.com/groups/javaforum.hu/
- A hozzászóláshoz be kell jelentkezni