Spring Service和RestTemplate Client始终是来自服务器的意外文件结束

时间:2017-04-06 15:43:32

标签: spring rest

我的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安全性这一事实有关?

1 个答案:

答案 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);

不要忘记添加杰克逊依赖。