【问题标题】:Serialize javax.ws.rs Entity to json将 javax.ws.rs 实体序列化为 json
【发布时间】:2015-01-21 09:32:41
【问题描述】:

我想用 org.glassfish.jersey 实现序列化到 Json

Map<String, String> entity = Maps.newHashMap();
entity.put("foo", "bar");

Response response = Response.status(Response.Status.OK)
                            .entity(entity)
                            .type(MediaType.APPLICATION_JSON).build();

System.out.println(response.getEntity());

此映射序列化为非标准{ foo: "bar" }。我想在单元测试中测试这种行为。

【问题讨论】:

    标签: java json jersey jax-rs jersey-2.0


    【解决方案1】:

    你不能这样测试。你在这里做什么

    Response response = Response.status(Response.Status.OK)
                                .entity(entity)
                                .type(MediaType.APPLICATION_JSON).build();
    

    正在构建出站响应。在 JAX-RS 框架中,我们发出响应后,例如

    @GET
    @Produced(MediaType.APPLICATION_JSON)
    public Response getResponse() {
        ...
        return Response.status(Response.Status.OK)
                        .entity(entity)
                        .type(MediaType.APPLICATION_JSON).build();
    }
    

    它仍然需要通过MessageBodyWriter 来序列化为 JSON。

    话虽如此,Jersey 有一个Test Framework,我们可以用它来测试我们的资源方法。你可以找到所有的官方例子at the Github

    一个样本(有一些改动):

    这些是最低要求的 Maven 依赖项

    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.test-framework</groupId>
            <artifactId>jersey-test-framework-core</artifactId>
            <version>2.13</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
            <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
            <version>2.13</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.13</version>
        </dependency>
    </dependencies>
    

    测试类

    public class TestJSONResource extends JerseyTest {
    
        @Override
        protected TestContainerFactory getTestContainerFactory() {
            return new GrizzlyTestContainerFactory();
        }
    
        @Path("test")
        public static class TestResource {
            @GET
            @Produces(MediaType.APPLICATION_JSON)
            public Response getJson() {
                Map<String, String> entity = Maps.newHashMap();
                entity.put("foo", "bar");
    
                Response response = Response.status(Response.Status.OK)
                        .entity(entity)
                        .type(MediaType.APPLICATION_JSON).build();
                return response;
            }
        }
    
        @Override
        protected DeploymentContext configureDeployment() {
            return DeploymentContext.builder(new ResourceConfig(TestResource.class))
                    .contextPath("context1/context2")
                    .build();
        }
    
        @Test
        public void testGet() {
            final WebTarget target = target("test");
            final String s = target.request().get(String.class);
            System.out.println(s);
        }
    }
    

    jersey-media-json-jackson 提供了 MessageBodyWriterMessageBodyReader 用于处理 JSON,这是为我们隐式注册的。

    【讨论】:

    • 谢谢,grizzly2 提供者返回标准{ "foo": "bar" } 而不是我的{ foo: "bar" }
    • Jersey 2.6 我的代码示例甚至无法编译。如果您需要进一步的帮助,您需要在帖子中包含更多信息,以便我们为您提供帮助,即产生问题的完整示例(具有依赖关系)。 InternalServerErrorException 服务器错误可能意味着什么
    • 更多关于InternalServerExceptiongist.github.com/mariuszs/d859481077f0b0112caa。你是对的,没有完整(或更具体)的例子,这是不可能帮助我的。再次感谢。
    • 提供者似乎没有使用 2.6 自动配置自己。使用您的测试,配置它可以工作new ResourceConfig(TestResource.class).register(JacksonJsonProvider.class)
    • register(JacksonFeature.class)
    猜你喜欢
    • 2021-09-27
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2011-12-09
    相关资源
    最近更新 更多