gpt4 book ai didi

java - 是否可以使用椭圆形 AbstractAnnotationCheck 设置多条消息?

转载 作者:搜寻专家 更新时间:2023-11-01 02:52:42 26 4
gpt4 key购买 nike

我正在使用 Oval 验证框架来验证 HTML 字段不能包含恶意 javascript 代码的字段。对于恶意代码检测,我使用了一个外部框架,该框架向我返回一个错误列表,我想将其用作现场的错误消息。我遇到的问题是我只能在检查实现中设置消息,而我宁愿做类似 setMessages(List) 的事情。因此,虽然我目前只是用逗号连接错误,但我宁愿将它们作为列表传回。

注释

@Target({ ElementType.METHOD, ElementType.FIELD})
@Retention( RetentionPolicy.RUNTIME)
@Constraint(checkWith = HtmlFieldValidator.class)
public @interface HtmlField {
String message() default "HTML could not be validated";
}

检查

public class HtmlFieldValidator  extends AbstractAnnotationCheck<HtmlDefaultValue> {
public boolean isSatisfied( Object o, Object o1, OValContext oValContext, Validator validator ) throws OValException {
if (o1 == null) {
return true;
} else {
CleanResults cleanResults = UIowaAntiSamy.cleanHtml((String) o1);
if (cleanResults.getErrorMessages().size() > 0) {
String errors = StringUtils.join(cleanResults.getErrorMessages(), ", ");
this.setMessage(errors);
return false;
} else {
return true;
}
}
}
}

模型类

class Foo {

@HtmlField
public String bar;

}

Controller 代码

Validator validator = new Validator(); // use the OVal validator
Foo foo = new Foo();
foo.bar = "<script>hack()</script>";

List<ConstraintViolation> violations = validator.validate(bo);

if (violations.size() > 0) {
// inform the user that I cannot accept the string because
// it contains invalid html, using error messages from OVal
}

最佳答案

如果 setMessage(String message) 是由父类(super class)创建的方法,您可以覆盖它,一旦它接收到数据,只需将字符串拆分成一个列表并调用第二个函数,您可以在其中实际上会放置您的代码。另外,我还建议将分隔字符串更改为更独特的内容,因为错误消息本身可能包含逗号。

虽然你的问题并没有多大意义。如果您将它们“传递回”到在父类(super class)中实现的方法,那么这会使您的问题的整个点无效,因为父类(super class)将处理数据。

我假设 setError 方法是一个简单的 setter ,它设置一个 String 变量来存储您计划在检查数据后访问的错误消息。由于您希望数据具有您喜欢的类型,只需在您的类中创建一个新的字符串数组并忽略父类(super class)。如果您愿意,您甚至可以同时使用两者。

public class HtmlFieldValidator  extends AbstractAnnotationCheck<HtmlDefaultValue> {
public String[] errorMessages = null;

public void setErrorMessages(String[] s) {
this.errorMessages = s;
}

public boolean isSatisfied( Object o, Object o1, OValContext oValContext, Validator validator ) throws OValException {
if (o1 == null) {
return true;
} else {
CleanResults cleanResults = UIowaAntiSamy.cleanHtml((String) o1);
if (cleanResults.getErrorMessages().size() > 0) {
//String errors = StringUtils.join(cleanResults.getErrorMessages(), ", ");
//this.setMessage(errors);
this.setErrorMessages(cleanResults.getErrorMessages());
return false;
} else {
return true;
}
}
}
}

其他地方:

HtmlFieldValidator<DefaultValue> hfv = new HtmlFieldValidator<DefaultValue>();
boolean satisfied = hfv.isSatisfied(params);
if (!satisfied) {
String[] errorMessages = hfv.errorMessages;
//instead of using their error message

satisfy(errorMessages);//or whatever you want to do
}

编辑:

更新代码后,我明白你的意思了。虽然我认为这有点过头了,稍后将字符串转换为数组会容易得多,但您可以通过创建一个扩展 Validator 的新类来做到这一点>setMessage 方法。在该方法中,您将调用 super.setMethod 并将字符串拆分并作为数组存储在其类中。

class ValidatorWithArray extends Validator {
public String[] errors;
public final static String SPLIT_REGEX = ";&spLit;";// Something unique so you wont accidentally have it in the error

public void setMessage(String error) {
super.setMessage(error);
this.errors = String.split(error, SPLIT_REGEX);
}
}

HtmlFieldValidator 中:

public boolean isSatisfied( Object o, Object o1, OValContext oValContext, Validator validator ) throws OValException {
if (o1 == null) {
return true;
} else {
CleanResults cleanResults = UIowaAntiSamy.cleanHtml((String) o1);
if (cleanResults.getErrorMessages().size() > 0) {
String errors = StringUtils.join(cleanResults.getErrorMessages(), ValidatorWithArray.SPLIT_REGEX);
this.setMessage(errors);
return false;
} else {
return true;
}
}
}

现在只需使用 ValidatorWithArray 而不是 Validator

关于java - 是否可以使用椭圆形 AbstractAnnotationCheck 设置多条消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328980/

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