Как обновить только определенные поля, которые могут быть уже нулевыми (с помощью патча JSON) - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь использовать json patch для обновления объекта с помощью PATCH в моем приложении.

Я хочу обновить только 2 поля в моем объекте, и они могут быть null перед обновлением.

Каждый раз, когда я пытаюсь обновить, весь объект обновляется.

Как мне это ограничить?

Я пробовал несколько способов.

@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);

}

Конфигурация Джексона:

@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();
    }
}

Как обновить только эти поля?

1 Ответ

0 голосов
/ 04 октября 2019

Ваш код длинный, почему вы получаете код-геттеры / сеттеры / конструкторы из typing.it? У вас будет много времени для разработки.

Тогда что вы должны добавить эту зависимость в ваш файл 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>

И, добавив эту зависимость, вы можете генерировать ваши методы получения / установки и конструкторы, давая простые аннотации, подобные этой. Не вводите их в свои пальцы. :-) Тогда ваш код будет более легко читаемым.

@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.


}

После этого, если пользователь не заполнит обязательные поля, появится сообщение.

И ваш класс контроллера, который означает, что ваше место вызова конечной точки должно использовать аннотацию @Valid для вашего класса Entity или класса DTO (вы не получаете 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

...