机密数据的自定义注释

时间:2017-07-07 15:05:44

标签: java validation annotations pojo javax

我正在创建一个应用程序,我计划在其中获取用户的机密数据。但是对于调试问题,我打算记录值,例如哪个用户名存在问题。但是不想记录他们的密码。

我有这个示例代码:

StringBuffer errorBuilder = new StringBuffer();
violations.forEach(v -> errorBuilder.append("\r\n\"")
                            .append(v.getPropertyPath())
                            .append("\": ")
                            .append(v.getMessage())
                            .append(" -- ")
                            .append(v.getInvalidValue())); // Avoid print here
return errorBuilder.toString();

这是示例类

@Getter
@Setter
public class UserCredentials {
    @NotNull
    @Size(min=5, max=15)
    private String username;

    @NotNull
    @Pattern(regex=Constants.Regex.PASSWORD)
    private String password;

    @NotNull
    @Pattern(regex=Constants.Regex.DOB)
    private String dob;

    @NotNull
    @Pattern(regex=Constants.Regex.EMAIL)
    private String email;
}

我认为有两种方式: 要输入密码"在列表中检查getPropertyPath是否包含列表中的值,并避免打印invalidValue。

但是有没有注释,或者可以有@Confidential这样的注释,我可以避免打印这个值。

我不介意创建自定义注释。我认为这样更干净,我不必每次都在编写我在列表中检查为机密的字段名。

我想过这样做:

StringBuffer errorBuilder = new StringBuffer();
violations.forEach(v -> {
if (v.getPropertyPath() has annotation @Confidential) { // Looking for this.
    errorBuilder.append("\r\n\"")
                                .append(v.getPropertyPath())
                                .append("\": ")
                                .append(v.getMessage())
} else {
     errorBuilder.append("\r\n\"")
                                .append(v.getPropertyPath())
                                .append("\": ")
                                .append(v.getMessage())
                                .append(" -- ")
                                .append(v.getInvalidValue()));
}
});
return errorBuilder.toString();

有关如何创建此注释并检查这些方案的任何想法?

1 个答案:

答案 0 :(得分:0)

考虑解决问题 -

在我的POJO上,我在toString()上放了一个例外。

@Getter
@Setter
@ToString(exclude="password")
public class UserCredentials {
    @NotNull
    @Size(min=5, max=15)
    private String username;

    @NotNull
    @Pattern(regex=Constants.Regex.PASSWORD)
    private String password;

    @NotNull
    @Pattern(regex=Constants.Regex.DOB)
    private String dob;

    @NotNull
    @Pattern(regex=Constants.Regex.EMAIL)
    private String email;
}

并且只放置了这个逻辑:

StringBuffer errorBuilder = new StringBuffer();
violations.forEach(v -> {
    errorBuilder.append("\r\n\"")
                                .append(v.getPropertyPath())
                                .append("\": ")
                                .append(v.getMessage())
});
return errorBuilder.toString();

在我使用POJO进行验证时放置日志,并在验证后立即打印错误(如果有错误)。