考虑以下pojo供参考:
public class User{ private String username; private String firstName; private String middleName; private String lastName; private String phone; //getters and setters }
我的应用程序基本上是基于Spring Boot的REST API,它公开了两个端点,一个端点创建用户,另一个端点检索用户。
“用户”落入某些类别, 基一 , B组 等。这是我从发布请求的报头中获得。
我需要在运行时中验证用户数据,并且验证可能因用户组而异。
例如,属于a组的用户可能会将电话号码作为可选字段,而对于其他某个组可能是必填字段。
正则表达式也可能根据其组而有所不同。
我需要能够配置spring,以便以某种方式动态验证我的pojo,一旦创建它们并根据其组触发了各自的验证集。
也许我可以创建一个yml / xml配置,使我能够启用它?
我希望不要private String phone用@NotNull和注释我@Pattern。
private String phone
@NotNull
@Pattern
我的配置如下:
public class NotNullValidator implements Validator { private String group; private Object target; public String getGroup() { return group; } public void setGroup(String group) { this.group = group; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } @Override public void validate(Object o) { if (Objects.nonNull(o)) { throw new RuntimeException("Target is null"); } } } public interface Validator { void validate(Object o); } @ConfigurationProperties(prefix = "not-null") @Component public class NotNullValidators { List<NotNullValidator> validators; public List<NotNullValidator> getValidators() { return validators; } public void setValidators(List<NotNullValidator> validators) { this.validators = validators; } }
application.yml
not-null: validators: - group: group-a target: user.username - group: group-b target: user.phone
我想将我的应用程序配置为以某种方式允许验证者选择其目标(实际对象, 而不是 yml中提到的字符串),并public void validate(Object o)在其目标上调用它们各自的对象。
public void validate(Object o)
聚苯乙烯
请随时编辑问题以使其变得更好。
我正在使用jackson对JSON进行序列化和反序列化。
如我所见,解决您的问题最简单的方法不是使用Spring或POJO,而是使用设计模式。
通过策略模式解决方案可以轻松解决您正在描述的问题。
您可以根据请求中期望的标头(用于描述用户类型)来匹配要使用的策略,然后在策略本身内部执行上述验证。
这将使您可以在整个方法中使用相同的POJO,并根据每种用户策略的类型来处理处理/解析和验证数据的细节。
这是Wiki书中的链接,其中包含对该模式的详细说明
策略模式
假设您有一个用于策略的基本界面:
interface Strategy { boolean validate(User user); }
对于2种不同类型的用户,您有2种不同的实现:
public class StrategyA implements Strategy { public boolean validate(User user){ return user.getUsername().isEmpty(); } } public class StrategyB implements Strategy { public boolean validate(User user){ return user.getPhone().isEmpty(); } }
您在您的UserPOJO中添加了一个Strategy属性,并Strategy在收到发布请求时为该属性分配正确的实现。
User
Strategy
每当您需要为该用户验证数据时,您只需调用validate分配策略的方法即可。
validate
如果每种方法User都适合多种策略,则可以添加一个List<Strategy>作为属性,而不是一个。
List<Strategy>
如果您不想更改POJO,则每次收到帖子请求时都必须检查哪种策略是正确的。
除了validate方法之外,您还可以添加方法来处理特定于每种策略的数据。
希望这可以帮助。