如何在失败时打印验证错误 - java

给定以下dto和控制器

public class PasswordCredentials implements AuthenticationProvider {

    @NotNull
    @NotEmpty
    @JsonProperty( access = JsonProperty.Access.WRITE_ONLY )
    private String user;

    @NotNull
    @NotEmpty
    @JsonProperty( access = JsonProperty.Access.WRITE_ONLY )
    private CharSequence pass;


    public void setPass( final CharSequence pass ) {
        this.pass = pass;
    }

    public void setUser( final String user ) {
        this.user = user;
    }

    @Override
    public Authentication toAuthentication() {
        return new UsernamePasswordAuthenticationToken( user, pass );
    }
}

@RestController
@RequestMapping( path = "authentication" )
class AuthenticationController {
    private final AuthenticationManager am;

    AuthenticationController( final AuthenticationManager am ) {
        this.am = am;
    }

    @RequestMapping( path = "password", method = RequestMethod.POST, consumes = {
        "!" + MediaType.APPLICATION_FORM_URLENCODED_VALUE
    } )
    ResponseEntity<?> login( @Valid @RequestBody final PasswordCredentials credentials ) {
        Authentication authenticate = am.authenticate( credentials.toAuthentication() );
        if ( authenticate.isAuthenticated() ) {
            return ResponseEntity.status( HttpStatus.NO_CONTENT ).build();
        }
        return ResponseEntity.status( HttpStatus.FORBIDDEN ).build();
    }

}

如果例如pass为null,将出现验证错误,并且将发生400,而无需调用我的控制器,这很好。但是那个400没有内容,是否有任何方法可以将控制器BindResults作为内容输出,以便API的使用者知道导致问题的原因?理想情况下,我不会在控制器方法中执行此操作,因此它将在所有控制器上发生?

我可以通过spring数据其余部分获得此行为,如下所示,但我希望所有API控制器都可以这样做。

class RestConfig extends RepositoryRestConfigurerAdapter {

    @Bean
    Validator validator() {
        return new LocalValidatorFactoryBean();
    }


    @Override
    public void configureValidatingRepositoryEventListener(
            final ValidatingRepositoryEventListener validatingListener ) {
        Validator validator = validator();
        //bean validation always before save and create
        validatingListener.addValidator( "beforeCreate", validator );
        validatingListener.addValidator( "beforeSave", validator );
    }

    @Override
    public void configureRepositoryRestConfiguration( final RepositoryRestConfiguration config ) {
        config.setBasePath( "/v0" );
        config.setReturnBodyOnCreate( false );
        config.setReturnBodyOnUpdate( false );
    }

参考方案

Spring具有@ControllerAdvice@ExceptionHandler批注以处理控制器中的错误。

@ControllerAdvice
public class ExceptionTranslator {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public Error processValidationError(MethodArgumentNotValidException ex) {
         BindingResult result = ex.getBindingResult();
        .....
        return new Error();
    }

    // Other exceptions
}

Spring MVC中的输入验证 - java

我知道Commons Validator框架是Struts项目在服务器端和客户端验证输入值的事实上的标准。Spring MVC项目是否也是如此?我得到的印象可能不是,大多数Struts书籍和论坛都谈论Commons Validator框架,但是只有少数Spring书籍和论坛可以。在Spring MVC项目中验证输入的最佳实践是什么?干杯! 参考方案 在引入S…

Java:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

Spring Security不允许加载CSS或JS资源 - java

该资源位于src / main / resources / static / css或src / main / resources / static / js下,我使用的是Spring Boot,安全级别为:@Configuration @EnableWebMvcSecurity @EnableGlobalAuthentication public clas…

Spring MVC Web应用程序检测暴力攻击的最佳方法? - java

Spring 3.0 MVC中是否有专门用于帮助检测Web应用程序的身份验证/登录页面上的蛮力攻击的功能? 参考方案 经过长期验证的实践是,如果身份验证失败,则会引入随机但相当大的延迟。这样,合法用户将立即登录,但攻击者每次尝试将花费500ms-1s,这使整个暴力概念不切实际(将永远存在)。合法用户偶尔失败的登录只会使他们稍有延迟,并且不会引起注意。如果需要…

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…