小编zaz*_*azi的帖子

具有泛型返回类型的自引用方法,用于多个继承的类

描述可能有点困难.但是,我会试试;)

遵循流畅的样式,类的方法通常返回类实例本身(this).

public class A {

    public A doSomething() {

        // do something here

        return this;
    }

}
Run Code Online (Sandbox Code Playgroud)

当扩展这样一个流畅的样式类时,可以通过泛型类型在第一个继承步骤中相当容易地执行此操作,并将返回类型转换为超类中的此泛型类型.

public class A<T extends A<T>> {

    public T doSomething() {

        // do something here

        return (T) this;
    }

}

public class B extends A<B> {

    // an extended class of class A

}
Run Code Online (Sandbox Code Playgroud)

但是,当在这个扩展类上做另一个继承步骤时,我在尝试定义方法的泛型返回类型(在上层类中)和类描述本身时遇到了麻烦,例如,超级超级中的方法class不会返回extend类的类型,而是返回超类的类型.但是,我的意图是这些流畅的样式方法应该总是返回当前类的类型(而不是上层类).

那么可以通过利用泛型来定义解决方案吗?

PS:我知道,一个简单的解决方法可能会覆盖扩展类中的所有这些方法并将它们转换为当前类型.但是,我对更优雅的解决方案感兴趣;)

java generics inheritance self-reference

9
推荐指数
1
解决办法
6447
查看次数

如何使用Jackson(2.x)提供程序设置Jersey客户端来处理POST请求

我正在努力设置Jersey客户端来测试对资源的POST请求.

我的泽西岛和杰克逊依赖关系看起来像这样:

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-grizzly2-http</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey</groupId>
            <artifactId>jersey-bom</artifactId>
            <version>${jersey.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

我正在使用Jersey 2.4和Jackson 2.2.3.

我像这样设置Client amd WebTarget:

client = JerseyClientBuilder.newBuilder().build();

target = client.target(Main.BASE_URI);
Run Code Online (Sandbox Code Playgroud)

我像这样设置服务器:

ResourceConfig rc = new ResourceConfig().packages("com.my.package.is.here");
HttpServer httpServer = GrizzlyHttpServerFactory
                           .createHttpServer(URI.create(BASE_URI), rc);
Run Code Online (Sandbox Code Playgroud)

我尝试在资源上测试POST请求:

ClientResponse response = target.path(resourceIdentifier)
                             .request(MediaType.APPLICATION_JSON_TYPE)
                             .post(Entity.json(testObjectJSON.toString()), 
                                       ClientResponse.class);
Run Code Online (Sandbox Code Playgroud)

目前,我收到以下错误:

javax.ws.rs.ProcessingException: Error reading entity from input stream.
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:849)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:768)
at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:96)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:761) …
Run Code Online (Sandbox Code Playgroud)

post json jersey jackson jersey-client

5
推荐指数
1
解决办法
1万
查看次数