我正在使用Spring Boot Data REST持久化我的user
实体
@Entity
public class User {
@Id
@GeneratedValue
private long id;
@NotEmpty
private String firstName;
@NotEmpty
private String lastName;
@NotEmpty
private String email;
@Size(min = 5, max = 20)
private String password;
// getters and setters
}
使用存储库:
public interface UserRepository extends CrudRepository<User, Long> {}
我要做的是首先验证post
ED用户:
@Configuration
public class CustomRestConfiguration extends SpringBootRepositoryRestMvcConfiguration {
@Autowired
private Validator validator;
@Override
protected void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
validatingListener.addValidator("beforeCreate", validator);
}
}
并且只在以后对用户密码进行哈希,然后再将其存储在DB中:
@Component
@RepositoryEventHandler(User.class)
public class UserRepositoryEventHandler {
private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
@HandleBeforeCreate
public void handleUserCreate(User user) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
}
}
结果是,验证是在密码散列之后执行的,结果由于散列的密码太长而失败。
有没有什么方法可以指示Spring先执行验证,然后才对密码进行哈希?我知道我可以自己编写一个控制器,并以细粒度的方式指定所有内容,但我宁愿把它作为最后的手段。
当我在调试器中进行调查时,发现传入的实体是按以下顺序处理的:
SpringValidatorAdapter::Validate
中反序列化JSON时执行bean验证。此处的密码为纯文本。@handlebeforecreate
并对密码进行哈希。BeanValidationEventListener::Validate
.解决方案1(两个阶段的全面验证)
这个解决方案的问题是它需要我编写自己的异常处理程序。为了跟上Spring Data REST在错误响应体方面设置的高标准,我必须为这个简单的案例编写大量的代码。这里描述了这样做的方法。
解决方案2(没有JPA实体验证的Spring bean验证)
正如Bohuslav Burghardt所暗示的,可以禁用由JPA完成的第二个验证阶段。这样,您就可以保留min和max约束,同时避免编写任何额外的代码。一如既往,它是简单性和安全性之间的权衡。这里介绍了禁用JPA的方法。
对此解决方案的唯一警告是@size(min=5)
似乎无法检查是否为空,因此我不得不添加@NotNull
来处理这种情况。“全部”字段注释为:
@NotNull
@Size(min = 5)
private String password;
我发布了简单的数据,比如 到(让它成为)/帖子乌里,例如smth喜欢 我可以验证,该正文不是空的 或者检查,响应的字段具有我们正在设置的值,例如 但我不确定,它的最佳/正确的方式。那么,问题:如何验证,该实体是在发布后创建的,并保证?
问题内容: 我的意图是读取原始资源,然后使用JSON将其转换为Java代码。执行此操作的类和外部库存储在另一个项目中。当我运行我的应用程序时,在日志猫中出现此错误: 我可以说该错误是由JSONArray的创建引起的。我已经在stackoverflow上遇到过此错误,但是没有明确的方法来解决此问题。任何人都可以向我推荐解决此问题的方法。帮助将不胜感激。 问题答案: 您正在添加似乎具有未解决依赖性的n
testing 包除了测试,还提供了运行并验证示例的功能。示例,一方面是文档的效果,是关于某个功能的使用例子;另一方面,可以被当做测试运行。 一个示例的例子如下: func ExampleHello() { fmt.Println("Hello") // Output: Hello } 如果 Output: Hello 改为:Output: hello,运行测试会失败,提示: got: He
问题内容: 我正在使用express-validator进行验证。我在数据库中使用猫鼬,它还内置了验证功能。我想知道应该使用哪一个? 我还想知道express-validator中的验证是否并行。以下面的代码为例: isUnique()是一种自定义验证方法,它检查电子邮件是否尚未注册,它查询数据库以进行验证。尽管在上面的代码中未提及,但是我还有其他一些职位要求,我需要验证多个字段,在每个字段中都将
我正在使用Springboot和Thyemleaf,试图用javax验证我的表单数据。验证。约束注释。 在我的模板中,我使用了一个Thyem立夫命令对象,它是我的模型类。在模型中,我有一些经过验证的字段- 这是用于输入文本/标题的超文本标记语言- 以下是提交表单时endpoint的控制器- 在我的模板中,我可以提交表单,如果或为空并且插入了带有消息的新div,将返回字段错误。 我遇到字段列表问题
我有一个父实体,与其子实体有OneToMany关联: 当我调用方法时,Hibernate不验证children集合@size约束,并按原样保留child“,这导致数据库中的实体无效。 为什么Hibernate不验证父实体?