繁体   English   中英

错误验证消息格式Spring Boot

[英]Error validation message format Spring boot

我是使用Java和Spring Boot的新手,我试图验证将存储在DB中的json输入,验证效果很好,问题是响应格式,我认为它不像Angular JS对客户端可读。需要知道如何从中更改输出格式:

{
"error": {
    "code": 400,
    "message": "Validation failed for classes [com.company.customerhelpcenter.domain.Ticket] during persist time for groups [javax.validation.groups.Default, ]\nList of constraint violations:[\n\tConstraintViolationImpl{interpolatedMessage='Descripción no puede ser null', propertyPath=description, rootBeanClass=class com.company.customerhelpcenter.domain.Ticket, messageTemplate='Descripción no puede ser null'}\n\tConstraintViolationImpl{interpolatedMessage='not a well-formed email address', propertyPath=email, rootBeanClass=class com.company.customerhelpcenter.domain.Ticket, messageTemplate='{org.hibernate.validator.constraints.Email.message}'}\n\tConstraintViolationImpl{interpolatedMessage='Número de teléfono no puede ser null', propertyPath=phone, rootBeanClass=class com.company.customerhelpcenter.domain.Ticket, messageTemplate='Número de teléfono no puede ser null'}\n]"
}}

对此

{
"error": {
    "description" : "Description cannot be null",
    "email": "Email cannot be null",
    "phone": "Phone cannot be null"
} }

这是我的控制器

@PostMapping
public ResponseEntity<?> create(@RequestBody Ticket ticket)
{
    return new ResponseEntity<>(this.ticketService.create(ticket), HttpStatus.CREATED);
}

服务:

public Ticket create(Ticket ticket)
{
    return this.ticketRepository.save(ticket);
}

仓库:

@Repository
public interface TicketRepository extends JpaRepository<Ticket, Integer>, Serializable
{}

实体

@Entity
@Table(name = "ticket")
public class Ticket implements Serializable
{
    private static final long serialVersionUID = 1L;

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

    @Basic(optional = false)
    @NotNull(message = "Descripción no puede ser null")
    @Size(min = 1, max = 255)
    @Column(name = "description")
    private String description;

    @Basic(optional = false)
    @NotNull(message = "Número de teléfono no puede ser null")
    @Size(min = 1, max = 20)
    @Column(name = "phone")
    private String phone;

    @Basic(optional = false)
    @NotNull(message = "Email no puede ser null")
    @Size(min = 1, max = 80)
    @Email
    @Column(name = "email")
    private String email;

    @Basic(optional = false)
    @NotNull
    @Column(name = "locked")
    private boolean locked;

    @JoinColumn(name = "ticket_type_id", referencedColumnName = "id")
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @Exclude
    private TicketType ticketType;

    @OneToMany(mappedBy = "ticket")
    private Set<TicketHistory> ticketHistories = new HashSet<TicketHistory>();


    public Integer getId()
    {
        return this.id;
    }

    public String getDescription()
    {
        return this.description;
    }

    public String getPhone()
    {
        return this.phone;
    }

    public String getEmail()
    {
        return this.email;
    }

    public TicketType getTicketType()
    {
        return this.ticketType;
    }

    public boolean isLocked()
    {
        return this.locked;
    }

    public Set<TicketHistory> getTicketHistories()
    {
        return this.ticketHistories;
    }
}

您的异常是ConstraintValidationException ,它意味着代码通过Controller传递,但由于验证而无法将数据保存在数据库中。 我的建议是在此之前先验证数据,然后在数据获得Controller之前先对其进行验证。 因此,将是这样的:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({MethodArgumentNotValidException.class})
    public ResponseEntity<Map<String, Object>> yourExceptionHandler(MethodArgumentNotValidException e) {
        Map<String, Object> response = new HashMap<String, Object>();
        Map<String, String> errors = new HashMap<String, String>();

        BindingResult bindingResult = e.getBindingResult();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        for (FieldError fieldError : fieldErrors) {
            errors.put(fieldError.getField(), fieldError.getDefaultMessage());
        }

        response.put("error", errors);
        return new ResponseEntity<Map<String, Object>>(response, HttpStatus.BAD_REQUEST);
    }
}

并且您的控制器应具有以下@Valid批注:

@PostMapping
public ResponseEntity<?> create(@RequestBody @Valid Ticket ticket) {
    return new ResponseEntity<>(this.ticketService.create(ticket), HttpStatus.CREATED);
}

然后,将验证对票证的验证,例如@NotNull@Size等。

但是,如果您不想这样验证,而只想处理ConstraintValidationException ,则可以执行以下操作:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({ ConstraintViolationException.class})
    public ResponseEntity<Map<String, Object>> yourExceptionHandler(ConstraintViolationException e) {
        Map<String, Object> response = new HashMap<String, Object>();
        Map<String, String> errors = new HashMap<String, String>();
        Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();

        for (ConstraintViolation<?> constraintViolation : constraintViolations) {
            errors.put(constraintViolation.getPropertyPath().toString() , constraintViolation.getMessage());
        }

        response.put("error", errors);
        return new ResponseEntity<Map<String, Object>>(response, HttpStatus.BAD_REQUEST);
    }
}

暂无
暂无

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

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