Java Jersey:注入不使用Jetty的共享对象

Java Jersey:注入不使用Jetty的共享对象,java,rest,dependency-injection,jersey-2.0,Java,Rest,Dependency Injection,Jersey 2.0,我们希望在Jetty上实现一个REST服务,该服务接收来自多个客户端的心跳信号,这些心跳信号存储在Hashmap中,以便在进一步的功能中使用它们 这就是代码目前的样子: 应该被注入的类 public class SharedMemory { private SharedMemory sharedMemory = null; private HashMap<String, HeartbeatModel> memory = null; private final

我们希望在Jetty上实现一个REST服务,该服务接收来自多个客户端的心跳信号,这些心跳信号存储在Hashmap中,以便在进一步的功能中使用它们

这就是代码目前的样子:

应该被注入的类

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 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;
    }
}
@ApplicationPath(“/”)
公共类应用程序扩展了javax.ws.rs.core.Application{
@凌驾
public Set>classes=new HashSet();
添加(GCEHeartbeatService.class);
添加(SharedMemoryFeature.class);
返回类;
}
}
这些是使用的依赖项:

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

org.glassfish.jersey.core
泽西服务器
2.17
org.glassfish.jersey.containers
jersey容器servlet
2.17
org.apache.httpcomponents
httpclient
4.4.1
de.hszg
常见的
1.0-快照
org.glassfish.jersey.bundles
杰克斯里
2.13
javax.servlet
servlet api
2.5
com.fasterxml.jackson.jaxrs
jackson jaxrs json提供程序
2.5.3
因此,在这种配置下,当我将检测信号发布到postHeartbeat服务时,即使使用另一种媒体类型,我也总是会收到415不受支持的媒体类型异常

“…我在发布时总是收到415不支持的媒体类型异常”

这似乎不是与DI配置相关的问题。看起来您只需要注册JSON提供程序。与这个特定的提供者

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.5.3</version>
</dependency>
如果您查看jar,您还将看到一个您可能想要注册的
异常apper

或者,您可以使用


另外,如果可移植性不是问题,我将使用
ResourceConfig
类(扩展
应用程序
)。与之合作要容易得多

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

参见

谢谢你的好答案,jacksonprovider的课程缺失是本例的问题所在。我没有意识到被重写的getClass函数的影响。所以它现在可以正常工作了。我会检查你的建议。
classes.add(JacksonJsonProvider.class);
-- or --
classes.add(JacksonJaxbJsonProvider.class);
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.17</version>
</dependency>
classes.add(JacksonFeature.class);
@ApplicationPath("/")
public class AppConfig extends ResourceConfig {
    public AppConfig() {
        packages("scan.packages.for.resource.and.provider");
        register(ResourceOrProvider.class);
        register(new MyAppBinder());
    }
}