如何 send/accept JSON 使用 JerseyTest 框架

How to send/accept JSON using JerseyTest Framework

我正在尝试编写一个简单的测试 class,它模拟 RESTful Web 服务通过 POST 方法创建客户。以下在 assertEquals 失败,我收到 400 Bad Request 响应。我无法使用调试器来观察堆栈跟踪。但是控制台告诉我以下内容...

信息:已启动监听器绑定到 [localhost:9998]
信息:[HttpServer] 已启动。

public class SimpleTest extends JerseyTestNg.ContainerPerMethodTest {

    public class Customer {
        public Customer() {}

        public Customer(String name, int id) {
            this.name = name;
            this.id = id;
        }

        @JsonProperty("name")
        private String name;

        @JsonProperty("id")
        private int id;
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(MyService.class);
    }

    @Path("hello")
    public static class MyService {
        @POST
        @Consumes(MediaType.APPLICATION_JSON)
        public final Response createCustomer(Customer customer) {
            System.out.println("Customer data: " + customer.toString());
            return Response.ok("customer created").build();
        }
    }

    @Test
    private void test() {
        String json =   "{" +
                "\"name\": \"bill\", " +
                "\"id\": 4" +
                "}";
        final Response response = target("hello").request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(json));
        System.out.println(response.toString());
        assertEquals(response.getStatus(), 200);
    }
}

不用打印 response.toString(),您可以使用 response.readEntity(String.class) 读取实际正文。您会在正文中找到一条来自 Jackson

的错误消息

No suitable constructor found for type [simple type, class simple.SimpleTest$Customer]: can not instantiate from JSON object (need to add/enable type information?)

乍一看你的 Customer class 看起来不错;它有一个默认的构造函数。但真正的问题是 Jackson 无法实例化它,因为它是一个非静态内部 class。所以要修复它,只需使 Customer class static

public static class Customer {}

作为一般规则,当与 JSON 和 Jackson 一起工作时,通常当你得到 400 分时,这是 Jackson 的问题,而 Jackson 非常擅长吐出有意义的信息,这将有助于我们调试。