1

我正在尝试编写一个简单的测试类来模拟通过POST方法创建客户的 RESTful Web 服务。以下失败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);
    }
}
4

1 回答 1

4

response.toString()您可以使用 阅读实际正文,而不是打印response.readEntity(String.class)。您会在正文中找到来自 Jackson 的错误消息

没有找到适合类型 [simple type, class simple.SimpleTest$Customer] 的构造函数:无法从 JSON 对象实例化(需要添加/启用类型信息?)

乍一看,你的Customer课看起来还不错;它有一个默认构造函数。但真正的问题是杰克逊无法实例化它,因为它是一个非静态内部类。所以要修复它,只需创建Customerstatic.

public static class Customer {}

作为一般规则,当使用 JSON 和 Jackson 与 Jersey 工作时,通常当你得到 400 时,这对 Jackson 来说是个问题,而 Jackson 非常擅长吐出有助于我们调试的有意义的消息。

于 2015-10-19T00:18:27.680 回答