验证器(@Validated @Valid)不适用于Spring和TomEE

时间:2019-01-01 18:00:43

标签: spring tomee

在没有Maven或Grade的情况下,验证程序无法与Spring和TomEE一起使用。

我创建了一个基础项目。 当我输入不正确的数据时,验证器只会执行任何操作(没有错误,没有日志,没有任何限制)。

无效。 它不验证ret服务的参数。 它不会在创建的DTO上进行验证。 我尝试了很多方法。

我快疯了,请帮助我。

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@NotNull
public class PersonaDTO  {


    @Min(0)
    @Max(270)
    private int eta;

    @Pattern(regexp = "[A-Z]+[a-z][a-z]+")
    private String Cognome;

    @Pattern(regexp = "[A-Z]+[a-z][a-z]+")
    private String Nome;


    @Max(240)
    @Min(80)
    private int altezza;


    public PersonaDTO() {
    }


    public PersonaDTO( String cognome, String nome,int eta, int altezza) {
        this.eta = eta;
        Cognome = cognome;
        Nome = nome;
        this.altezza = altezza;
    }

    public String getCognome() {
        return Cognome;
    }

    public void setCognome(String cognome) {
        Cognome = cognome;
    }

    public String getNome() {
        return Nome;
    }

    public void setNome(String nome) {
        Nome = nome;
    }

    public int getAltezza() {
        return altezza;
    }

    public void setAltezza(int altezza) {
        this.altezza = altezza;
    }

    public int getEta() {
        return eta;
    }

    public void setEta(int eta) {
        this.eta = eta;
    }
}


package it.paolo.spring.rest;

@RestController
@Validated
public class RestSpring {

       @RequestMapping(value = "/crea/{cogome}/{nome}/{eta}/{altezza}",
                        produces = "application/json"
         )
        @Validated  @Valid
        public  PersonaDTO creaPersona(
                @PathVariable("cogome") @Pattern(regexp = "[A-Z]+[a-z][a-z]+") @Valid String strCognome,
                @PathVariable("nome") @Valid @Pattern(regexp = "[A-Z]+[a-z][a-z]+") String strNome,
                @PathVariable("eta") int intEta,
                @PathVariable("altezza") int intAletezza
        ) {

                PersonaDTO persona=new PersonaDTO(strCognome,strNome,intEta,intAletezza);

                return persona;
        }

}

1 个答案:

答案 0 :(得分:0)

@PathVariable并不意味着要进行验证才能将可读消息发送回用户。原则上,pathVariable永远不应无效。

如果pathVariable无效,则原因可能是错误生成了错误的URL(例如,jsp中的href)。不需要@Valid,也不需要消息,只需修复代码;

“用户”正在操纵URL。同样,不需要@Valid,也不应向用户提供有意义的消息。

在这两种情况下,只要留下异常气泡,直到被常规的Spring ExceptionHandlers捕获,即可生成漂亮的错误页面或有意义的json响应,指示错误。 为了获得此结果,您可以使用自定义编辑器进行一些验证

仍然要验证 PathVariable ,可以使用org.springframework.validation.annotation.Validated来验证RequestParamPathVariable

Init ValidationConfig

@Configuration
public class ValidationConfig {
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
        return processor;
    }
}

@Validated添加到您的控制器处理程序类,例如:

@RestController
@Validated
public class RestSpring {
....
}

将验证器添加到您的处理程序方法

@RequestMapping(value = "/crea/{cogome}/{nome}/{eta}/{altezza}", produces = "application/json")
  public  PersonaDTO creaPersona(
                @PathVariable("cogome") @Pattern(regexp = "[A-Z]+[a-z][a-z]+") @Valid String strCognome,
                @PathVariable("nome") @Valid @Pattern(regexp = "[A-Z]+[a-z][a-z]+") String strNome,
                @PathVariable("eta") int intEta,
                @PathVariable("altezza") int intAletezza) 
                {

                PersonaDTO persona=new PersonaDTO(strCognome,strNome,intEta,intAletezza);

                return persona;
        }