繁体   English   中英

如何仅更新可能已经是 null 的某些字段(使用 JSON 补丁)

[英]How to only update certain fields that might already be null (using JSON patch)

我正在尝试使用 json 补丁在我的应用程序中使用PATCH更新 object。

我只想更新 object 中的 2 个字段,在更新之前它们可能是null

每次我尝试更新时,整个 object 都会更新。

我该如何限制这个?

我尝试了多种方法。

@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 vehPatched=patchHelp.patch(jsonPatch, veh, BmwsalesUpdate.class);
    oMapper.update(vehicle, vehPatched);
    System.out.println("the patched info is: "+vehicle.getRfidtag()+vehicle.getTemplocation());
    bmwService.updateVehTag(vehicle);
    return new ResponseEntity<>(HttpStatus.OK);

@Override
public void updateVehTag(Bmwsales vehicle) {
    bmwsalesRepository.save(vehicle);

}

Jackson 配置:

@Configuration
public class JacksonConfig {

@Bean
public ObjectMapper objectMapper(){
            .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
            .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .findAndRegisterModules();
}}

Bmwsales class

@Entity(name="bmwsales")
@Table(name="bmwsales")
public class Bmwsales implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @Column(name="customerfirstname")
    private String customerfirstname;

    @Column(name="customerlastname")
    private String customerlastname;

    @Column(name="lastmileage")
    private Integer lastmileage;

    @Column(name="licensenum")
    private String licensenum;

    @Column(name="make")
    private String make;

    @Column(name="currentmileage")
    private Integer currentmileage;

    @Column(name="model")
    private String model;

    @Column(name="purchasedhere")
    private String purchasedhere;

    @JsonSerialize(using = JsonDateSerializer.class)
    @Column(name="rfiddate")
    private Timestamp rfiddate;

    @Column(name="rfidtag")
    private String rfidtag;

    @Column(name="stocknum")
    private String stocknum;

    @Column(name="vehiclerole")
    private String vehiclerole;

    @NotBlank
    @Column(name="vin")
    private String vin;

    @Column(name="year")
    private Timestamp year;

    @Column(name="vineight")
    private String vineight;

    @Column(name="taggingsource")
    private String taggingsource;

    @Column(name="vehicletype")
    private String vehicletype;

    @Column(name="salutation")
    private String customersal;

    @Column(name="customermiddlename")
    private String customermiddlename;

    @Column(name="suffix")
    private String suffix;

    @Column(name="address1")
    private String address1;

    @Column(name="address2")
    private String address2;

    @Column(name="city")
    private String city;

    @Column(name="state")
    private String state;

    @Column(name="zip")
    private String zip;

    @Column(name="county")
    private String county;

    @Column(name="homephone")
    private String homephone;

    @Column(name="cellphone")
    private String cellphone;

    @Column(name="email")
    private String email;

    @Column(name="cobuyersalutation")
    private String cobuyersal;

    @Column(name="cobuyerfirstname")
    private String cobuyerfirstname;

    @Column(name="cobuyermiddlename")
    private String cobuyermiddlename;

    @Column(name="cobuyerlastname")
    private String cobuyerlastname;

    @Column(name="salesperson")
    private String salesperson;

    @Column(name="salesperson2")
    private String salesperson2;

    @Column(name="purchasedheredate")
    private Timestamp purchasedheredate;

    @Column(name="carwashmember")
    private String carwashmember;

    @Column(name="serviceadvisor")
    private String serviceadvisor;

    @JsonSerialize(using = JsonDateSerializer2.class)
    @Column(name="openrodate")
    private Date openrodate;

    @Column(name="closerodate")
    private Timestamp closerodate;

    @Column(name="openro")
    private String openro;

    @Column(name="snstext")
    private Timestamp snstext;

    @Column(name="carwashexpire")
    private Timestamp carwashexpire;

    @Column(name="enterrodate")
    private Timestamp enterrodate;

    @Column(name="servicecarwash")
    private String servicecarwash;

    @Column(name="templocation")
    private String templocation;

    public Bmwsales(String vineight){
        this.vineight=vineight;
    }


    public static class Builder{
        private Integer id;
        private String rfidtag;

        //@JsonSerialize(using = JsonDateSerializer.class)
        private Timestamp rfiddate;

        private String vin;
        private String vineight;
        private String templocation;


        public Builder setVin(String vin) {
            this.vin=vin;
            return this;
        }


        public Builder setVineight(String vineight) {
            this.vineight=vineight;
            return this;
        }

        public Builder setRfidtag(String rfidtag) {
            this.rfidtag=rfidtag;
            return this;
        }

        public Builder setRfiddate(Timestamp rfiddate) {
            this.rfiddate=rfiddate;
            return this;
        }

        public Builder setTemplocation(String templocation) {
            this.templocation=templocation;
            return this;
        }

        /*public Builder setOpenro(String openro){
            this.openro=openro;
            return this;
        }

        public Builder setOpenrodate(Date openrodate){
            this.openrodate=openrodate;
            return this;
        }*/


        public Bmwsales build(){
            Bmwsales bmwsales=new Bmwsales(vin, vineight,rfidtag,rfiddate, 
templocation);
            return bmwsales;
        }
    }

    public Bmwsales(String vin, String vineight, String rfidtag, Timestamp 
 rfiddate, String templocation){
        this.vin=vin;
        this.vineight=vineight;
        this.rfiddate=rfiddate;
        this.rfidtag=rfidtag;
        this.templocation=templocation;


    }



    public Bmwsales(String customersal, String customerfirstname, String 
  customerlastname, String customermiddlename, String suffix, 
            String make, Integer currentmileage, String model, String 
  purchasedhere, String vehiclerole, String vin, String vineight, 
            Timestamp year, String taggingsource, String vehicletype, 
  String address1, String address2, String city, String state,
            String zip, String county, String homephone, String cellphone, 
  String email, String cobuyersal, String cobuyerfirstname,
            String cobuyermiddlename, String cobuyerlastname, String 
 salesperson, String salesperson2, Timestamp purchasedheredate,
            String carwashmember, String serviceadvisor, Date openrodate, 
 Timestamp closerodate, Timestamp snstext, String openro,
            Timestamp carwashexpire, Timestamp enterrodate, String 
servicecarwash, Timestamp rfiddate, String rfidtag, String templocation){
        super();
        this.customersal=customersal;
        this.customerfirstname=customerfirstname;
        this.customermiddlename=customermiddlename;
        this.customerlastname=customerlastname;
        this.suffix=suffix;
        this.make=make;
        this.currentmileage=currentmileage;
        this.model=model;
        this.purchasedhere=purchasedhere;
        this.vehiclerole=vehiclerole;
        this.vin=vin;
        this.vineight=vineight;
        this.year=year;
        this.taggingsource=taggingsource;
        this.vehicletype=vehicletype;
        this.address1=address1;
        this.address2=address2;
        this.city=city;
        this.state=state;
        this.zip=zip;
        this.county=county;
        this.homephone=homephone;
        this.cellphone=cellphone;
        this.email=email;
        this.cobuyersal=cobuyersal;
        this.cobuyerfirstname=cobuyerfirstname;
        this.cobuyermiddlename=cobuyermiddlename;
        this.cobuyerlastname=cobuyerlastname;
        this.salesperson=salesperson;
        this.salesperson2=salesperson2;
        this.purchasedheredate=purchasedheredate;
        this.carwashmember=carwashmember;
        this.serviceadvisor=serviceadvisor;
        this.openrodate=openrodate;
        this.closerodate=closerodate;
        this.snstext=snstext;
        this.openro=openro;
        this.carwashexpire=carwashexpire;
        this.enterrodate=enterrodate;
        this.servicecarwash=servicecarwash;
        this.rfiddate=rfiddate;
        this.rfidtag=rfidtag;
        this.templocation=templocation;

    };

    public Bmwsales(){

    }



    public void setId(Integer id) {
        this.id=id;
    }

    public Integer getId() {
        return id;
    }

    public void setCustomersal(String customersal) {
        this.customersal=customersal;
    }

    public String getCustomersal() {
        return customersal;
    }

    public void setCustomerfirstname(String customerfirstname) {
        this.customerfirstname=customerfirstname;
    }

    public String getCustomerfirstname() {
        return customerfirstname;
    }

    public void setCustomermiddlename(String customermiddlename) {
        this.customermiddlename=customermiddlename;
    }

    public String getCustomermiddlename() {
        return customermiddlename;
    }

    public void setCustomerlastname(String customerlastname) {
        this.customerlastname=customerlastname;
    }

    public String getCustomerlastname() {
        return customerlastname;
    }

    public void setSuffix(String suffix) {
        this.suffix=suffix;
    }

    public String getSuffix() {
        return suffix;
    }

    public void setMake(String make) {
        this.make=make;
    }

    public String getMake() {
        return make;
    }

    public void setCurrentmileage(Integer currentmileage) {
        this.currentmileage=currentmileage;
    }

    public Integer getCurrentmileage() {
        return currentmileage;
    }

    public void setModel(String model) {
        this.model=model;
    }

    public String getModel() {
        return model;
    }

    public void setPurchasedhere(String purchasedhere) {
        this.purchasedhere=purchasedhere;
    }

    public String getPurchasedhere() {
        return purchasedhere;
    }

    public void setVehiclerole(String vehiclerole) {
        this.vehiclerole=vehiclerole;
    }

    public String getVehiclerole() {
        return vehiclerole;
    }

    public void setVin(String vin) {
        this.vin=vin;
    }

    public String getVin() {
        return vin;
    }

    public void setVineight(String vineight) {
        this.vineight=vineight;
    }

    public String getVineight() {
        return vineight;
    }

    public void setYear(Timestamp year) {
        this.year=year;
    }

    public Timestamp getYear() {
        return year;
    }

    public void setTaggingsource(String taggingsource) {
        this.taggingsource=taggingsource;
    }

    public String getTaggingsource() {
        return taggingsource;
    }

    public void setVehicletype(String vehicletype) {
        this.vehicletype=vehicletype;
    }

    public String getVehicletype() {
        return vehicletype;
    }

    public void setAddress1(String address1) {
        this.address1=address1;
    }

    public String getAddress1() {
        return address1;
    }

    public void setAddress2(String address2) {
        this.address2=address2;
    }

    public String getAddress2() {
        return address2;
    }

    public void setCity(String city) {
        this.city=city;
    }

    public String getCity() {
        return city;
    }

    public void setState(String state) {
        this.state=state;
    }

    public String getState() {
        return state;
    }

    public void setZip(String zip) {
        this.zip=zip;
    }

    public String getZip() {
        return zip;
    }

    public void setCounty(String county) {
        this.county=county;
    }

    public String getCounty() {
        return county;
    }

    public void setHomephone(String homephone) {
        this.homephone=homephone;
    }

    public String getHomephone() {
        return homephone;
    }

    public void setCellphone(String cellphone) {
        this.cellphone=cellphone;
    }

    public String getCellphone() {
        return cellphone;
    }

    public void setEmail(String email) {
        this.email=email;
    }

    public String getEmail() {
        return email;
    }

    public void setCobuyersal(String cobuyersal) {
        this.cobuyersal=cobuyersal;
    }

    public String getCobuyersal() {
        return cobuyersal;
    }

    public void setCobuyerfirstname(String cobuyerfirstname) {
        this.cobuyerfirstname=cobuyerfirstname;
    }

    public String getCobuyerfirstname() {
        return cobuyerfirstname;
    }

    public void setCobuyermiddlename(String cobuyermiddlename) {
        this.cobuyermiddlename=cobuyermiddlename;
    }

    public String getCobuyermiddlename() {
        return cobuyermiddlename;
    }

    public void setCobuyerlastname(String cobuyerlastname) {
        this.cobuyerlastname=cobuyerlastname;
    }

    public String getCobuyerlastname() {
        return cobuyerlastname;
    }

    public void setSalesperson(String salesperson) {
        this.salesperson=salesperson;
    }

    public String getSalesperson() {
        return salesperson;
    }

    public void setSalesperson2(String salesperson2) {
        this.salesperson2=salesperson2;
    }

    public String getSalesperson2() {
        return salesperson2;
    }

    public void setPurchasedheredate(Timestamp purchasedheredate) {
        this.purchasedheredate=purchasedheredate;
    }

    public Timestamp getPurchasedheredate() {
        return purchasedheredate;
    }

    public void setCarwashmember(String carwashmember) {
        this.carwashmember=carwashmember;
    }

    public String getCarwashmember() {
        return carwashmember;
    }

    public void setServiceadvisor(String serviceadvisor) {
        this.serviceadvisor=serviceadvisor;
    }

    public String getServiceadvisor() {
        return serviceadvisor;
    }

    public void setOpenrodate(Date openrodate) {
        this.openrodate=openrodate;
    }


    public Date getOpenrodate() {
        return openrodate;
    }

    public void setCloserodate(Timestamp closerodate) {
        this.closerodate=closerodate;
    }

    public Timestamp getCloserodate() {
        return closerodate;
    }

    public void setSnstext(Timestamp snstext) {
        this.snstext=snstext;
    }

    public Timestamp getSnstext() {
        return snstext;
    }

    public void setOpenro(String openro) {
        this.openro=openro;
    }

    public String getOpenro() {
        return openro;
    }

    public void setCarwashexpire(Timestamp carwashexpire) {
        this.carwashexpire=carwashexpire;
    }

    public Timestamp getCarwashexpire() {
        return carwashexpire;
    }

    public void setEnterrodate(Timestamp enterrodate) {
        this.enterrodate=enterrodate;
    }

    public Timestamp getEnterrodate() {
        return enterrodate;
    }

    public void setServicecarwash(String servicecarwash) {
        this.servicecarwash=servicecarwash;
    }

    public String getServicecarwash() {
        return servicecarwash;
    }

    public void setRfiddate(Timestamp rfiddate) {
        this.rfiddate=rfiddate;
    }


    public Timestamp getRfiddate() {
        return rfiddate;
    }

    public void setRfidtag(String rfidtag) {
        this.rfidtag=rfidtag;
    }

    public String getRfidtag() {
        return rfidtag;
    }

    public void setTemplocation(String templocation) {
        this.templocation=templocation;
    }

    public String getTemplocation() {
        return templocation;
    }

    public static Object Builder() {
        return new Bmwsales.Builder();
    }
}

如何仅更新这些字段?

您的代码很长,为什么您要从打字中编写 getter/setter/constructors。它将需要很长时间来开发。

那么您必须将此依赖项添加到您的 POM.xml 文件中

 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
            <scope>provided</scope>
        </dependency>

并添加此依赖项,您可以通过提供类似这样的简单注释来生成您的 getter/setter 和构造函数。不要在您的手指中输入它们。:-) 这样您的代码将更易于阅读。

@Data  //this will create all getters,setters,toString 
@NoArgsConstructor //this will create default constructor
@AllArgsConstructor //this will create all argivements constructor
@Entity(name="bmwsales") //name means table name 
public class Bmwsales implements Serializable{

@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

// like this do all your columns
@NotNull(message="customer First Name is compulsory") 
@Column(name="customerfirstname")
private String customerfirstname;

  //your entity mapping here etc.


}

之后,如果用户未填写必填字段,该消息将触发。

而您的 controller class 这意味着您的端点调用位置应该对您的实体 class 或 DTO 类使用 @Valid 注释(您没有获得 DTO)。

@PatchMapping("/bmwsales/updateweb/{id}")
public ResponseEntity<String> updateVehicleTagWeb(@PathVariable(value="id") Integer id, @Valid @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 vehPatched=patchHelp.patch(jsonPatch, veh, BmwsalesUpdate.class);
    oMapper.update(vehicle, vehPatched);
    System.out.println("the patched info is: "+vehicle.getRfidtag()+vehicle.getTemplocation());
    bmwService.updateVehTag(vehicle);
    return ResponseEntity.ok("Input is valid");

如需更多了解我所说的内容,请参阅此链接:- https://www.baeldung.com/spring-boot-bean-validation

暂无
暂无

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

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