GlassFish JSON-B

Fórumok

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?

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

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