【问题标题】:How to fix 422 status response from patch如何修复补丁中的 422 状态响应
【发布时间】:2019-10-02 20:59:50
【问题描述】:

我有一个 react 前端和 java 后端。我正在使用 axios.patch 请求,并且一直收到 422 响应。我不知道出了什么问题。我希望它能够正确更新。我正在使用 jsonpatch 来尝试更新这个对象。

我尝试了很多东西。我的请求有问题吗?我不知道。

这是我的代码:

 return API.patch(`bmwsales/updateWeb/${vid}/`, veh, {headers: { 
'Authorization' : basic }})
             .then((response) =>{
                    if (response.status==200){
   dispatch(updateVehicleSuccess());
                    }

                }, (error) =>{
                        if (error.response.status == 500){

  dispatch(vehicleError(error.message, "Could not update rfidtag, please try again."));
                        }else if 
(error.response.status == 422){

dispatch(vehicleError(error.message, "Could not update rfidtag, please try again."));
                        }

控制器:

@PatchMapping("/bmwsales/updateWeb/{id}")
public ResponseEntity<?> updateVehicleTagWeb(@PathVariable(value="id") Integer id, @RequestBody Bmwsales v) throws JsonProcessingException{
    ObjectMapper objMapper=new ObjectMapper();
            JsonPatchBuilder jsonPatchBuilder=Json.createPatchBuilder();
    JsonPatch jsonPatch=jsonPatchBuilder.replace("/templocation",v.getTemplocation()).replace("/rfidtag", v.getRfidtag()).build();
    Bmwsales vehicle=bmwService.getVin(id).orElseThrow(ResourceNotFoundException::new);
BmwsalesUpdate veh=oMapper.asInput(vehicle);
    BmwsalesUpdate h=patchHelp.patch(jsonPatch, veh, BmwsalesUpdate.class);
    oMapper.INSTANCE.update(vehicle, h);
        return new ResponseEntity<>(h, HttpStatus.OK);

我想知道如何解决这个问题......

错误: xhr.js:178 补丁http://...../bmwsales/updateWeb/69406/422

看起来正在发生这种情况....临时位置中当前没有值,我正在尝试更新它....如何更改我的对象映射器以接受当前值可以为空?我在想这就是问题所在……也许……

javax.json.JsonException: '{"id":69406,"rfidtag":"E200420C71A06015010B6362"}' 不包含名称“templocation”的值

好的,我想我解决了这个问题....我更改了我的 Jackson 配置,将 setdefaultpropertyinclusion 注释掉,只包含非空值。现在没关系。但现在不是更新我指出的 2 个字段,而是 json 补丁正在尝试更新整个对象。我该如何限制这个?

【问题讨论】:

  • 您可以稍微简化代码,将参数 Integer id 更改为 Bmwsales vehicle(spring boot 会执行一些方面代理魔术,然后将 id 映射到 en entity 或 null) .也许不是 Bmwsales 确切(如果它的 DTO),而是一个实体类
  • P.S. (@PathVariable(value="id") Integer id, ... -> (@PathVariable(value="id") YurEntityClass vehicle, ...
  • 感谢您的回复。我需要将 id 和 Bmwsales 对象分开。 id 是我要更新的 Bmwsales 对象的 id。然后过来的 Bmwsales 对象有我要更新的 2 个项目。 @RostyslavBarmakov

标签: java spring-boot axios patch


【解决方案1】:

也许您可以在@PatchMapping 中将consumes 属性设置为MediaType 类中的APPLICATION_JSON_VALUE 值和带有URL 字符串的value 字段,同时检查您的Bmwsales 对象并查看是否所有字段都符合您的要求。

希望这会有所帮助。

【讨论】:

  • 感谢您的回复。 Bmwsales 对象有 35 个字段。我只需要更新其中的 2 个,因此进入我的控制器的 Bmwsales 对象只有 2 个不为空的字段……这是个问题吗? @snake_404
  • 也许,你能把你的宝马销售代码放在这里吗?或者只是验证您的字段是否没有required 字段或类似的字段。我想您已经这样做了,但以防万一,您是否调试过代码并验证您可以访问控制器代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
相关资源
最近更新 更多