【问题标题】:Jackson JSON - Unmarshal on create but ignore on updateJackson JSON - 在创建时解组但在更新时忽略
【发布时间】:2014-09-18 00:12:48
【问题描述】:

使用 Spring 4,我有一个用例,其中资源(下例中的 A)具有在使用 REST 更新(http put 和 patch)时应该被忽略的属性。该属性只能在创建时具有值(http post)。所以情况是 create 上的解组应该考虑该属性,但 应该在更新时忽略它

public class A {
  private String strOnCreateAndUpdate; //persist on both create and update
  private String strOnCreateOnly; //only persist on create, never on update
  //getters & setters
} 

在控制器中

@RestController
@RequestMapping(value="/a"
public class ControllerA {
    @RequestMapping(method= RequestMethod.POST)
    public void create(@Validated @RequestBody A req) {
        //create the record
    }

    @RequestMapping(value="/{id}", method=RequestMethod.PUT)
    public void update(@PathVariable Long id, @Validated @RequestBody A req) {
        //Update the record by ignoring strOnCreateOnly
    }

    @RequestMapping(value="/{id}", method=RequestMethod.PATCH)
    public void update(@PathVariable Long id, @RequestBody Map<String,Object> reqMap){
        //Update the record by ignoring strOnCreateOnly
    }
}

我能想到的一种方法(并且是一种非常不优雅的方法)是允许解组发生,但在更新方法中,手动将 strOnCreateOnly 设置为其原始值。

但是有没有使用 Spring 4 和 Jackson 的可配置方式(例如,使用注释并忽略解组的属性)?甚至向 API 的调用者发送一个错误,说不允许更新 strOnCreateOnly 也没问题。

【问题讨论】:

  • 如果您找到了解决方案,请告诉我们 :)

标签: spring-mvc jackson spring-4


【解决方案1】:

我认为你可以使用@JsonView

Jackson Doc Link

而您创建了一个View 类来表示操作类型:(更新、创建、全部)。像这样的

// View definitions:
class Views {
    static class Common { }
    static class Update extends Common { }
    static class Create extends Common { }
}   

像这样将它应用到你的班级

public class A {
    @JsonView(View.Common.class)
    private String strOnCreateAndUpdate; //persist on both create and update

    @JsonView(View.Create.class)
    private String strOnCreateOnly; //only persist on create, never on update
    //getters & setters
} 

在您的 create 方法中,使用 Create 视图编组类。然后在更新方法上,只需使用CommonUpdate 视图即可。

【讨论】:

  • 谢谢!。我的印象是 JsonView 仅用于编组,但我知道的还不够。我会试一试,看看它是否有效!
  • 看起来视图在编组时不起作用。尽管控制器上有@JsonView 像这里显示的docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/…,但它仍在分解属性
  • 嗯...我稍后再试一次。但是我们对我之前的项目所做的与此类似。或者也许还有其他方法。
猜你喜欢
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多