各位大神好,請教個問題
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中的欄位不符合定義就直接拋異常,這樣不更合理些嗎?
問題:
為什麼一定要在程式碼中用result.hasErrors()顯示判斷?
難道不能驗證UserRequest中的欄位不符合定義就直接拋異常,這樣不更合理些嗎?
例如我們在參數異常的時候返回給前端的是異常的具體參數名稱和描述,不是 Spring 給出的所有異常信息,如果 Spring 自動拋出異常,那麼返回的信息你自己就不好控制了。
你只是在你的應用場景中考慮為什麼,一個框架更多的是考慮大多數時候怎麼做最合理。
大部分對於客戶端資料的驗證都不應被當作“異常”,而是使用者在不知道的情況下被允許犯的錯誤。