2015-05-08 69 views
1

我們希望在Jetty上實現REST服務,它接收來自多個客戶端的心跳,並且這些心跳存儲在散列圖中以便在其他功能性中與它們一起使用。澤西島:注入與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> 

如果覆蓋資源/供應商通過使用classpath掃描(你所做的一切,只是通過重寫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