java - Warum löst SpringMVC nicht direkt eine Ausnahme aus, wenn es den Ruhezustandsvalidator zur Parameterüberprüfung integriert?
天蓬老师
天蓬老师 2017-06-23 09:13:55
0
2
916

Hallo zusammen, ich habe eine Frage

1. Umgebung

spring 4.3.7
hibernate-validator-5.4.1

2. Die Konfiguration ist wie folgt

    <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 und 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);  
        } 
        
        ……
    }

Frage:
Warum müssen wir result.hasErrors() verwenden, um die Beurteilung im Code anzuzeigen?
Ist es nicht sinnvoller, zu überprüfen, ob die Felder in UserRequest nicht der Definition entsprechen, und einfach direkt eine Ausnahme auszulösen?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

Antworte allen(2)
Peter_Zhu

问题:
为什么一定要在代码中用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();
}
三叔

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

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage