如何 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 非常擅长吐出有意义的信息,这将有助于我们调试。
我正在尝试编写一个简单的测试 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 非常擅长吐出有意义的信息,这将有助于我们调试。