我的POJO:
public class Product {
String name;
int price;
public Product(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
我的控制器:
@RestController
@RequestMapping("/rest")
public class RstController {
@RequestMapping(value = "/getProductPost2", method=RequestMethod.POST, produces = {"application/json"})
public Product getProductPost2(@RequestBody Product p){
System.out.println(p.getName());
return p;
}
我的客户端,使用JUnit(我已尝试所有注释的行,每次都出现相同的错误):
public class RestTemplatePostTest {
@Test
public void testee(){
String url = "http://localhost:8443/ShoppingCartSpringMVCSpringDataHibernate/rest/getProductPost2";
Product p = new Product();
p.setName("produs");
p.setPrice(22);
String json = "{\"name\":\"pen\",\"price\":10}";
HttpEntity<Product> request = new HttpEntity<Product>(p);
RestTemplate rt = new RestTemplate();
rt.postForObject(url, json, String.class);
//rt.postForObject(url, p, String.class);
//rt.exchange(url, HttpMethod.POST, request, Product.class);
//rt.exchange(url, HttpMethod.POST, request, String.class);
//assertEquals("produs",p2.getName());
}
}
当我使用POSTMAN时,它可以工作。 我没有在互联网上找到任何其他选项,因为我试图这样做已经2天了。任何意见或教程都受到欢迎。
Edit1:另外,简单的GET也不起作用,但它可以在浏览器或POSTMAN中使用。
@RequestMapping(value = "/getProductGet", method=RequestMethod.GET)
public String getProductGet{
return "hello World!!";
}
@Test
public void testGet(){
String url = "http://localhost:8443/ShoppingCartSpringMVCSpringDataHibernate/rest/getProductGet";
RestTemplate rt = new RestTemplate();
ResponseEntity<String> response= rt.getForEntity(url, String.class);
}
当处于调试模式时,它会在浏览器或POSTMAN调用时在断点处停止,但在使用rest模板时它不会到达。 也许与我使用Spring安全性这一事实有关?
答案 0 :(得分:0)
我认为问题是您的请求数据类型错误,服务器无法解析,因此无法回复。
由于您要发送带有JSON Content-Type的POST请求,因此Product
必须是JSON编码的。
为此,您需要添加一个json转换器,以便将代码修改为以下内容:
RestTemplate rt= new RestTemplate();
rt.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Product recievedProduct = rt.postForObject(url, p, Product.class);
不要忘记添加杰克逊依赖。