Разбор объекта с помощью @PostMapping с использованием доступа к методам - PullRequest
0 голосов
/ 13 апреля 2020

Я попытался проанализировать тело запроса в объекте Ship

    @PostMapping("/ships")
    public Ship createShip(@RequestBody Ship ship){

        return ship;
    }

И когда объект Ship был десериализован, пружина использовала только значения впрыска для полей. Но я хочу, чтобы весна использовала сеттеры для этих полей.

Я попытался добавить аннотацию @JsonSetter к сеттерам, и она работает хорошо. Но я думаю, что это плохо.

    @Entity
    public class Ship {

        @Id
        @GeneratedValue
        private Long id;

        private String name;
        private String planet;


        public String getName() {
            return name;
        }

        @JsonSetter
        public void setName(String name) {
            if(name == null || name == "") throw new IllegalArgumentException("Error while setting name. Can't be null and empty");
            if(name.length() > 50) throw new IllegalArgumentException("Error while setting name. Can't be mere than 50 chars");
            this.name = name;
        }

        public String getPlanet() {
            return planet;
        }

        @JsonSetter
        public void setPlanet(String planet) {
            if(planet == null || planet == "") throw new IllegalArgumentException("Error while setting planet. Can't be null and empty");
            if(planet.length() > 50) throw new IllegalArgumentException("Error while setting planet. Can't be mere than 50 chars");
            this.planet = planet;
        }

    }

Возможно, существуют некоторые аннотации, подобные этой:

    createShip(@RequestBody(access = METHODS) Ship ship)

или

    @Entity 
    @JsonDeserialize(access=METHODS)
    public class Ship {

1 Ответ

1 голос
/ 13 апреля 2020

Сохраните свой класс судна как POJO, и условия проверки в установщиках могут быть организованы как функция проверки пружины, упомянутая в руководстве по пружине .

Проверка бобов с помощью пружины -

  1. определение пользовательского валидатора
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;


@Component
public class ShipValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return Ship.class.equals(clazz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
         Ship ship = (Ship) obj;
         String name = ship.getName();
         String planet = ship.getPlanet();

         if(StringUtils.isEmpty(name)) errors.rejectValue("name", "Can't be null or Empty");
         if(StringUtils.isEmpty(planet)) errors.rejectValue("planet", "Can't be null or Empty");
         if(name.length() > 50) errors.rejectValue( "name", "Can't be more than 50 chars");
         if(planet.length() > 50) errors.rejectValue("planet", "Can't be more than 50 chars");

    }

}

изменения в контроллере для использования этого валидатора

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class ShipController {

    @Autowired ShipRepo shipRepo;

    @Autowired ShipValidator shipValidator;

    @PostMapping("/ships")
    public Ship saveShip(@RequestBody Ship ship, BindingResult result) {
        shipValidator.validate(ship, result);

        if(result.hasErrors()) {
            //TODO: add your exception handling logic and handle these errors           
            throw new IllegalArgumentException("Error in properties");
        }

        return shipRepo.save(ship);
    }
}

...