登录

java - SpringMVC集成hibernate validator进行参数验证时,为什么不直接抛异常?

各位大神好,请教个问题

1.环境

spring 4.3.7
hibernate-validator-5.4.1

2.配置如下

    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource" name="messageSource">
        <property name="basenames">
            <list>
                <value>classpath:messages/messages</value>
                <value>classpath:messages/ValidationMessages</value>
            </list>
        </property>
        <property name="useCodeAsDefaultMessage" value="false" />
        <property name="defaultEncoding" value="UTF-8" />
        <property name="cacheSeconds" value="60" />
    </bean>

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>
    
    
    <mvc:annotation-driven validator="validator" />

3.bean和Controller

public class UserRequest {
    
    @NotBlank(message = "{login.valid.username.notnull}")
    private String username;
    
    @NotBlank(message = "{login.valid.password.notnull}")
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public Object login(@Valid @RequestBody UserRequest ur, BindingResult result, HttpServletRequest request) {
        
        log.debug("login");
        
        if(result.hasErrors()) {  
            return result.getAllErrors().get(0);  
        } 
        
        ……
    }

问题:
为什么一定要在代码中用result.hasErrors()显示判断?
难道不能验证UserRequest中的字段不符合定义就直接抛异常,这样不更合理些吗?

# Java
天蓬老师 天蓬老师 2493 天前 675 次浏览

全部回复(2) 我要回复

  • 天蓬老师

    天蓬老师2017-06-23 09:15:55

    问题:
    为什么一定要在代码中用result.hasErrors()显示判断?
    难道不能验证UserRequest中的字段不符合定义就直接抛异常,这样不更合理些吗?

    例如我们在参数异常的时候返回给前端的是异常的具体参数名和描述,不是 Spring 给出的所有异常信息,如果 Spring 自动抛出异常,那么返回的信息你自己就不好控制了。

    @PostMapping(UriView.REST_KNOWLEDGE_POINTS)
    @ResponseBody
    public Result createKnowledgePoint(@Valid KnowledgePoint knowledgePoint, BindingResult bindingResult) {
        // 如有参数错误,则返回错误信息给客户端
        if (bindingResult.hasErrors()) {
            return Result.fail(CommonUtils.getBindingMessage(bindingResult));
        }
    
        knowledgePoint.setKnowledgePointId(CommonUtils.uuid());
        knowledgePoint.setName(knowledgePoint.getName().trim());
        mapper.createKnowledgePoint(knowledgePoint);
    
        return Result.ok("", knowledgePoint);
    }
    
    /**
     * BindingResult 中的错误信息很多,对用户不够友好,使用 getBindingMessage()
     * 提取对用户阅读友好的定义验证规则 message。
     *
     * @param result 验证的结果对象
     * @return 验证规则 message
     */
    public static String getBindingMessage(BindingResult result) {
        StringBuffer sb = new StringBuffer();
    
        for (FieldError error : result.getFieldErrors()) {
            // sb.append(error.getField() + " : " + error.getDefaultMessage() + "\n");
            sb.append(error.getDefaultMessage() + "\n");
        }
    
        return sb.toString();
    }

    回复
    0
  • 三叔

    三叔2017-06-23 09:15:55

    你只是在你的应用场景中考虑为什么,一个框架更多的是考虑大多数时候怎么做最合理。

    大部分对于客户端数据的验证都不应当被当作“异常”,而是用户在不知道的情况下被允许犯的错误。

    回复
    0
  • 取消 回复 发送