当前位置: 首页 > 知识库问答 >
问题:

Struts2:如何停用FieldValidators的默认消息

夏朗
2023-03-14


我正在使用Struts2开发JavaEE项目,我有一个名为to的jsp文件

<s:form action="login" method="post">
      <s:textfield name="name" label="Name" size="20" />
      <s:textfield name="age" label="Age" size="20" />
      <s:submit label="Submit" align="center" />
   </s:form>

注释验证器有适当的操作:

public class LoginAction extends ActionSupport {
    private String name;
    private int age;

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    @RequiredStringValidator(message = "String is empty", shortCircuit=true)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ConversionErrorFieldValidator(message = "Please enter a valid age", shortCircuit = true)
    @IntRangeFieldValidator(message = "Age must be in between 28 and 65",min = "29", max = "65",shortCircuit=true)
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

一切正常,但当我输入无效年龄(例如“test”字符串)时,我会看到消息,我在注释“请输入有效年龄”中设置的一个,以及默认情况下的另一个“字段“age”的无效字段值”,所以我的问题是如何在第二条消息中取消激活它。

编辑:这张图片显示了我收到的信息。

非常感谢。

共有1个答案

廖夜洛
2023-03-14

第一次阅读关于转换和验证错误的工作流程;

然后从官方文档中读取类型转换错误处理(粗体是我的):

类型转换错误处理提供了一种区分输入验证问题和输入类型转换问题的简单html" target="_blank">方法。

在类型转换期间发生的任何错误都可能需要报告,也可能不希望报告。例如,报告输入“abc”无法转换为数字可能很重要。另一方面,报告无法将空字符串“”转换为数字可能并不重要——尤其是在web环境中,很难区分用户未输入值和输入空白值。

默认情况下,所有转换错误都使用通用i18n键xwork.default.invalid.fieldvalue报告,您可以在全局i18n资源包中重写该键(默认文本是字段xxx的无效字段值,其中xxx是字段名称)。

但是,有时您可能希望在每个字段的基础上覆盖此消息。您可以通过使用模式invalid添加一个仅与您的操作(action.properties)关联的i18n键来实现这一点。fieldvalue。xxx,其中xxx是字段名。

重要的是要知道,这些错误实际上都不是直接报告的。相反,它们被添加到ActionContext中名为conversionErrors的映射中。有几种方法可以访问此地图,并相应地报告错误。

错误报告有两种方式:

  • 在全球范围内,使用转换错误拦截器
  • 在每个字段的基础上,使用转换验证程序

默认情况下,转换拦截器包含在struts默认中。默认堆栈中的xml。要防止转换错误全局报告,请更改拦截器堆栈,并添加其他验证规则。

那么你的情况如何?

您使用的是默认堆栈(或具有相同行为的自定义堆栈),该堆栈在验证侦听器之前运行ConversionErrors侦听器。

然后,由于您定义的是一个ConversionErrorFieldValidator,所以您使用了这两种机制,而您应该只使用其中一种。

你可以选择以下三种方式中的任何一种:

全球资源方式

>

xwork.default.invalid.fieldvalue = Please enter a valid "{0}"

本地资源方式

>

invalid.fieldvalue.age = Please enter a valid age

定制方式

  • 从堆栈中删除ConversionError拦截器,以执行所有需要的操作

使用前两个解决方案,您不能短路它,那么您将同时拥有转换和(第一个,如果短路)验证器错误。但是这些值将被保留并自动重新填充(例如,将abc插入到int字段中,将在页面中重新填充abc)。

使用最后一个解决方案,您的消息将短路,但您必须手动处理字段的重新填充,并且您需要记住对每个字段使用自定义的@ConversionErrorFieldValidator,因为除非转换错误消息将被吞没。

就我个人而言,我会选择解决方案1。这是最安全的,而且基本上零工作成本。

 类似资料:
  • 我是新来的Spring。当我运行一个Spring批处理应用程序时,我希望只看到“Hello World!”,但相反,我得到了以下附加细节-

  • 我有一个父pom,它为我的其他组件提供所需的版本号变量 您必须使用分类器将补充工件附加到项目中,而不是替换它们 我发现这是因为jar打包固有的maven jar插件默认绑定,但我正在进行war打包,所以在war打包之后,默认jar执行开始并抛出上面的一个。任何停止违约的解决方案都将帮助我提前感谢。

  • 当使用注释()对带有自定义键(如name)的存储库时,会遇到在每个连续请求上运行额外的id字段查询的问题。 请参见下面的存储库代码:

  • 问题内容: 我正在使用logstash将日志输入ElasticSearch。我将logstash输出配置为: 我注意到,一旦启动logstash,它就会在ES中创建一个映射(日志),如下所示。 如何防止Logstash创建此映射? 更新: 我现在也解决了此错误。 “ [logs]的对象映射试图解析为对象,但是得到了EOF,是否提供了具体的价值?” 正如John Petrone在下面所述,定义映射后

  • 请查找我的应用程序登录FileAppender配置。 我没有为警报文件追加器配置任何rollingpolicy,但仍在进行滚动。我需要一个单一的文件,我的所有错误通过一天,一年等,请帮助。 谢谢Satyajit