繁体   English   中英

Spring Boot REST - 所需的字符串参数不存在

[英]Spring Boot REST - Required String parameter is not present

我无法将数据发送到 Spring Boot 服务器。 我与邮递员核对,一切都很好,但是我使用了 ReactJS 的 axios 库,出现错误

Required String parameter 'name' is not present.

添加产品功能

addProduct = (e) => {
 e.preventDefault();
    var { productName, productPrice, productStatus } = this.state;
    callApi('product/add', 'POST', {
        name: productName,
        price: productPrice,
        status: productStatus
    }).then(res => {
        console.log(res);
    });
}

产品控制器.java

@RestController
@RequestMapping(path = "/api/product")
public class ProductController {
    @Autowired
    private ProductRespository productRespository;

    @GetMapping(path = "/all")
    public @ResponseBody Iterable<Product> getAllProduct(){
        return productRespository.findAll();
    }

    @PostMapping(path = "/add")
    @ResponseBody
    public String createProduct(@RequestParam String name, @RequestParam Integer price, @RequestParam String status){
        Product product = new Product();
        product.setName(name);
        product.setPrice(price);
        product.setStatus(status);
        productRespository.save(product);
        return "OK";
    }
}

调用程序

import axios from 'axios';
import * as Config from './../constants/Config';

export default function callApi(endpoint, method, body) {
    return axios({
        method: method,
        url: `http://localhost:8000/api/${endpoint}`,
        data: body,
        headers: {
            'Access-Control-Allow-Origin': '*' 
        }
    }).catch(err => {
        console.log(err);
    });
}

我该如何解决?

你的休息服务需要名称、价格、状态作为请求参数,在春天这些默认情况下是强制性的。 但是在您的反应代码中,您不是将这些作为请求参数发送,而是将它们作为请求正文发送。

由于 name 是第一个参数,一旦它不可用,spring 就会抛出 'name' not available 异常,但是一旦你修复它,它就会抛出价格,然后是状态。 因此,将它们全部修复在一起。

您必须像下面那样更改控制器方法,这将提高代码效率并采用标准方式。

@PostMapping(path = "/add")
@ResponseBody
public String createProduct(@RequestBody Product product){
    productRespository.save(product);
    return "OK";
}

或者更改您的反应代码以在如下所示的请求中发送它们。 但是对于“POST”方法,不推荐这样做。 因为这会暴露 url 本身传递的信息。

addProduct = (e) => {
    e.preventDefault();
    var { productName, productPrice, productStatus } = this.state;
    callApi('product/add?name=' + productName +  '&price=' + productPrice + '&status=' + productStatus , 'POST', {}).then(res => {
        console.log(res);
    });
}

@RequestParam注释从 url 获取其数据。 应该是这样的:

?name=myname&price=100&status=ok

如果您将数据作为请求正文中的 json 对象发送,则@RequestBody注释就是您要查找的内容。 确保您还将axios请求中的Content-Type设置为application/json

axios.post('url', JSON.stringify({
        "name": productName,
        "price": productPrice,
        "status": productStatus,
     }) , { headers: {  "Content-Type": "application/json"  }
})

您需要将 add 方法的参数更改为单个@RequestBody Product参数。 或者你应该在你的 Axios 请求中包含所有参数作为查询参数: product/add?name=myname&price=100&status=ok

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM