java - Jersey: Injecting of shared object not working with Jetty -


we want implement rest-service on jetty, receives heartbeat multiple clients , these heartbeats stored in hashmap work them in further functionallities.

thats how code looks @ moment:

the class should injected.

public class sharedmemory {      private sharedmemory sharedmemory = null;     private hashmap<string, heartbeatmodel> memory = null;     private final reentrantreadwritelock lock = new reentrantreadwritelock();     private final lock readlock  = lock.readlock();     private final lock writelock = lock.writelock();      public sharedmemory(){         memory = new hashmap<string, heartbeatmodel>();     }      ... } 

the binder class:

public class sharedmemorybinder extends abstractbinder{         @override         protected void configure() {             bind(new sharedmemory()).to(sharedmemory.class);     } } 

the feature class:

public class sharedmemoryfeature implements feature{     @override     public boolean configure(featurecontext context) {         context.register(new sharedmemorybinder());         return true;      } } 

the service class

@path("/heartbeatservice") public class gceheartbeatservice {      @inject     private sharedmemory sharedmemory;      @post     @path("/postheartbeat")     @consumes(mediatype.application_json)     public response postheartbeat(heartbeat heartbeat){         sharedmemory.storetomemory(heartbeat);          return response.ok().build();     }     ... } 

the application class:

@applicationpath("/") public class application extends javax.ws.rs.core.application {     @override     public set<class<?>> getclasses() {         set<class<?>> classes = new hashset<>();         classes.add(gceheartbeatservice.class);         classes.add(sharedmemoryfeature.class);         return classes;     } } 

these used dependencies:

<dependencies>     <dependency>         <groupid>org.glassfish.jersey.core</groupid>         <artifactid>jersey-server</artifactid>         <version>2.17</version>     </dependency>     <dependency>         <groupid>org.glassfish.jersey.containers</groupid>         <artifactid>jersey-container-servlet</artifactid>         <version>2.17</version>     </dependency>     <dependency>         <groupid>org.apache.httpcomponents</groupid>         <artifactid>httpclient</artifactid>         <version>4.4.1</version>     </dependency>     <dependency>         <groupid>de.hszg</groupid>         <artifactid>common</artifactid>         <version>1.0-snapshot</version>     </dependency>     <dependency>         <groupid>org.glassfish.jersey.bundles</groupid>         <artifactid>jaxrs-ri</artifactid>         <version>2.13</version>     </dependency>     <dependency>         <groupid>javax.servlet</groupid>         <artifactid>servlet-api</artifactid>         <version>2.5</version>     </dependency>     <dependency>         <groupid>com.fasterxml.jackson.jaxrs</groupid>         <artifactid>jackson-jaxrs-json-provider</artifactid>         <version>2.5.3</version>     </dependency> </dependencies> 

so configuration, 415 unsupported media type exception when post heartbeat postheartbeat service, media type.

"...i 415 unsupported media type exception when post"

this doesn't seem problem related di configuration. looks need register json provider. particular provider

<dependency>     <groupid>com.fasterxml.jackson.jaxrs</groupid>     <artifactid>jackson-jaxrs-json-provider</artifactid>     <version>2.5.3</version> </dependency> 

if override registration of resources/provider through classpath scanning (which have done, overriding getclasses() , returning non-empty set, provider not registered.

you can register yourself.

classes.add(jacksonjsonprovider.class); -- or -- classes.add(jacksonjaxbjsonprovider.class); 

if in jar, see exceptionmapper may want register.

alternatively, can use this dependency

<dependency>     <groupid>org.glassfish.jersey.media</groupid>     <artifactid>jersey-media-json-jackson</artifactid>     <version>2.17</version> </dependency> 

which wraps above dependency in auto-discoverable feature, , registers, provider , exceptionmapper. dependency, won't need register anything. if weird reason isn't register, can add yourself

classes.add(jacksonfeature.class); 

as aside, if portability not issue, use resourceconfig class (which extends application) instead. it's easier work with.

@applicationpath("/") public class appconfig extends resourceconfig {     public appconfig() {         packages("scan.packages.for.resource.and.provider");         register(resourceorprovider.class);         register(new myappbinder());     } } 

see resourceconfig api


Comments