首頁  >  問答  >  主體

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中的欄位不符合定義就直接拋異常,這樣不更合理些嗎?

天蓬老师天蓬老师2645 天前846

全部回覆(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
  • 取消回覆