我正在尝试编写一个简单的测试类,它模拟通过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);
}
}
答案 0 :(得分:4)
您可以使用response.toString()
阅读实际正文,而不是打印response.readEntity(String.class)
。您将在身体中找到的是杰克逊的错误消息
找不到类型[simple type,class simple.SimpleTest $ Customer]的合适构造函数:无法从JSON对象实例化(需要添加/启用类型信息?)
乍一看,Customer
课程看起来不错;它有一个默认的构造函数。但真正的问题是杰克逊无法实例化它,因为它是一个非静态的内部类。所以要修复它,只需创建Customer
类static
即可。
public static class Customer {}
作为一般规则,当与JSON和杰克逊一起使用泽西时,通常当你得到400时,这对杰克逊来说是一个问题,杰克逊非常擅长吐出一条有助于我们调试的有意义的信息。