gpt4 book ai didi

Java Hibernate Validator 需要一个或另一个

转载 作者:搜寻专家 更新时间:2023-11-01 01:32:31 25 4
gpt4 key购买 nike

这是我的 previous question 的扩展.我实现了 Dennis R 的回答并使用了 hibernate-validator。有没有办法要求在 json 请求中指定一个字段或另一个字段,但不能同时指定两个字段?在我之前的帖子中,在 Request 类中,我希望用户传入 id 或代码,但不能同时传入。

我找到了 this resource这对我来说可能是正确的解决方案,但我不完全理解那里发生了什么,为什么它有效,坦率地说,这看起来太冗长了。这是唯一的方法吗?

最佳答案

正如我之前和之后评论的 Nicko's来自 here 的回答,你可以用下面的代码实现你想要的:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
public @interface FieldMatch {

String message() default "something is wrong!";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

/**
* @return The first field
*/
String first();

/**
* @return The second field
*/
String second();

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface List {
FieldMatch[] value();
}

public static class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object> {

private String firstFieldName;
private String secondFieldName;

@Override
public void initialize(FieldMatch fieldMatch) {
firstFieldName = fieldMatch.first();
secondFieldName = fieldMatch.second();
}

public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {
try {
final Object firstObj = getProperty(object, firstFieldName);
final Object secondObj = getProperty(object, secondFieldName);

if(firstObj == null && secondObj == null || firstObj != null && secondObj != null) {
return false;
}
} catch (final Exception ignore) {
// ignore
}
return true;
}

private Object getProperty(Object value, String fieldName) {
Field[] fields = value.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals(fieldName)) {
field.setAccessible(true);
try {
return field.get(value);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return null;
}
}

}

用法:

@FieldMatch.List({
@FieldMatch(first = "name", second = "people"),
@FieldMatch(first = "age", second = "abc")
})
public class Foo {

private String name;
private List<String> people;
private int age;
private Boolean abc;
}

对您来说唯一的区别是您不想检查内容是否相等,只要一个字段为空而另一个字段不为空即可。

编辑:

要按照评论中的要求在您的 ExceptionHandler 上获取对象,您只需将异常包装在一个自定义的异常周围并在您抛出它时传递该对象,即:

public class CustomException extends Exception {

private String message;
private Object model;

public CustomException(String message, Object model) {
super(message);
this.model = model;
}

public Object getModel() {
return model;
}
}

有了这个,你可以像这样简单地得到它:

@ExceptionHandler(CustomException.class)
public ModelAndView handleCustomException(CustomException ex) {
Object obj = ex.getModel();
//do whatever you have to
}

关于Java Hibernate Validator 需要一个或另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36365734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com