2015-05-08 3 views
1

Мы хотим реализовать REST-Service на Jetty, который получает Heartbeat от нескольких клиентов, и эти Heartbeats хранятся в Hashmap для работы с ними в следующих функциональных единицах.Джерси: Включение общего объекта, не работающего с Jetty

Вот как выглядит код на данный момент:

Класс, который должен быть введен.

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

    ... 
} 

Класс Связующее:

public class SharedMemoryBinder extends AbstractBinder{ 
     @Override 
     protected void configure() { 
      bind(new SharedMemory()).to(SharedMemory.class); 
    } 
} 

Функция Класс:

public class SharedMemoryFeature implements Feature{ 
    @Override 
    public boolean configure(FeatureContext context) { 
     context.register(new SharedMemoryBinder()); 
     return true; 
    } 
} 

Сервис класс класс

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

Применение:

@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; 
    } 
} 

Это используются зависимости:

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

Так что с этой конфигурацией, я всегда получает исключение типа в 415 неподдерживаемых СМИ, когда я отправляю сердцебиение к службе postHeartbeat, даже с другим типом носителя.

ответ

2

«... я всегда получаю исключение типа в 415 неподдерживаемый СМИ, когда я отправляю»

Это не похоже, проблемы, связанные с конфигурацией DI. Похоже, вам просто нужно зарегистрировать поставщика JSON. С помощью этого конкретного поставщика

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.5.3</version> 
</dependency> 

Если переопределить регистрацию ресурсов/провайдера через сканирование пути к классам (которые вы сделали, просто перекрывая getClasses() и возвращает непустое множество, то провайдер не будет зарегистрирован.

вы можете просто зарегистрировать его самостоятельно.

classes.add(JacksonJsonProvider.class); 
-- or -- 
classes.add(JacksonJaxbJsonProvider.class); 

Если посмотреть в банке, вы также видите ExceptionMapper вы можете зарегистрировать.

В качестве альтернативы, вы можете использовать this dependency

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.17</version> 
</dependency> 

, который облегает выше зависимость в авто-обнаруживаемым функции и регистры, поставщик и ExceptionMapper. С этой зависимостью вам не нужно ничего регистрировать. Если по какой-то странной причине не зарегистрируетесь, вы можете просто добавить его самостоятельно

classes.add(JacksonFeature.class); 

Как и в сторону, если портативность не является проблемой, я бы использовал ResourceConfig класс (который простирается Application) вместо , С этим работать гораздо проще.

@ApplicationPath("/") 
public class AppConfig extends ResourceConfig { 
    public AppConfig() { 
     packages("scan.packages.for.resource.and.provider"); 
     register(ResourceOrProvider.class); 
     register(new MyAppBinder()); 
    } 
} 

Посмотреть ResourceConfig API

+0

Спасибо за хороший ответ, отсутствующий класс для jacksonprovider была проблема в данном случае. Я не знал о влиянии переопределенной функции getClass. Так что теперь все отлично. Я проверю ваши предложения. – AKR

Смежные вопросы