【问题标题】:Struts 2 validation not workingStruts 2 验证不起作用
【发布时间】:2014-06-20 14:57:26
【问题描述】:

我正在尝试使用 struts 2 自定义验证框架进行验证,但这似乎不起作用。我正在做一个非常大的项目,我正在开发的模块,我正在尝试实现它。

问题 struts 2 没有检测到我的validation.xml。我尝试创建一个示例项目并使用了这个validation.xml,它正在工作,但在项目中同样不起作用。

我正在使用模型驱动,我希望这不应该是问题。 操作支持提供的基本验证工作正常,但我的验证不行。

<interceptors>
    <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
    <interceptor name="browserCachingInterceptor" class="com.comviva.im.ui.interceptor.BrowserCachingInterceptor" />
    <interceptor name="sessionHijackInterceptor" class="com.comviva.im.ui.interceptor.SessionHijackInterceptor" />
    <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
    <interceptor-stack name="defaultSecurityStack">
        <interceptor-ref name="defaultStack">
            <param name="exception.logEnabled">true</param>
            <param name="exception.logLevel">DEBUG</param>
        </interceptor-ref>
        <interceptor-ref name="tokenSession">
            <param name="excludeMethods">*</param>
        </interceptor-ref>

        <interceptor-ref name="sessionHijackInterceptor" />
        <interceptor-ref name="browserCachingInterceptor" />
    </interceptor-stack>
</interceptors>

<default-interceptor-ref name="defaultSecurityStack"></default-interceptor-ref>

拦截器声明也很好。 我尝试了几天,但仍然无法找出问题所在。剩下的唯一选择是调试。 任何人都可以建议我应该在哪里寻找。 validation.xml 文件在哪里加载到 ActionInvocation 中,以便我可以检查验证文件是否正确加载。

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
  <field name="nodeId">
      <field-validator type="required">
          <message key="errors.required"/>
      </field-validator>
      <field-validator type="int">
          <param name="min">1</param>
          <param name="max">10000</param>
          <message>bar must be between ${min} and ${max}, current value is ${bar}.</message>
      </field-validator>
  </field>
  <field name="selfISDNNumber">
        <field-validator type="required">
          <message key="errors.required"/>
      </field-validator>
  </field>

</validators>

这是我的动作类的摘录:

public class NodeAction extends BaseAction implements ModelDriven<NodeConfigurationForm>, ParameterAware ,Preparable {

    NodeConfigurationForm nodeConfigForm = new NodeConfigurationForm();
    private static final Logger logger = Logger.getLogger(NodeAction.class);
    private NodeConfigurationService configurationService;

    private List<NodeConfiguration> nodeListTable = null;
    Map<String , String[]>  requestParams;
    private int isFallBackChannelEnable;
    private int smsSupportEnable;
    private ServletContext servletContext;

我的 NodeAction 类扩展了 BaseAction,它扩展了 ActionSupport,默认情况下是验证感知的。所以 NodeAction 也应该与自定义验证一起使用。 这是我的 struts.xml 关于操作的摘录:

<action name="createGWNode" method="create" class="com.comviva.im.ui.ussdGateway.action.NodeAction">
    <result name="success" type="tiles">createGWNode</result>
</action>

<action name="addGWNode" method="add" class="com.comviva.im.ui.ussdGateway.action.NodeAction">
    <result name="success" type="chain">listGWNodes</result>
    <result name="input" type="tiles">createGWNode</result>
    <result name="error" type="tiles">createGWNode</result>
</action>

<action name="editGWNode" method="edit" class="com.comviva.im.ui.ussdGateway.action.NodeAction">
    <result name="success" type="tiles">createGWNode</result>
</action>

<action name="updateGWNode" method="update" class="com.comviva.im.ui.ussdGateway.action.NodeAction">
    <result name="success" type="redirect">listGWNodes</result>
    <result name="input" type="tiles">createGWNode</result>
    <result name="error" type="tiles">createGWNode</result>
</action>

这是我的jsp

<s:textfield name="nodeId" required="true" theme="simple" />reado
<s:radio name="status" list="#{'1':'Enable','0':'Disable'}" theme="simple"></s:radio>
<s:textfield name="gwInstanceName" theme="simple" />
<s:textarea name="description" cols="30" rows="2" theme="simple"/>

<s:textfield name="serverIp" theme="simple"/>
<s:textfield name="serverIp" theme="simple" readonly=< s:textfield name="loginUserId" theme="simple"/>
<s:password name="loginPassword" showPassword="true" theme="simple"/>
<s:textfield name=" selfISDNNumber " theme="simple "/>
<s:select name="logLevel " list="logLevelList " theme="simple "/>

【问题讨论】:

  • 抱歉,我没听明白:您是在尝试实现自定义验证器(在 validators.xml 中)还是在尝试指定验证规则(在 validations.xml 中)?
  • @John:我正在指定验证规则。在调试模式下,我尝试查看验证拦截器,发现它没有为我的类加载验证规则。
  • 你是如何命名你的验证文件的?你把它放在哪里了?发布文件的内容也不错。
  • 如果没有访问者验证器,您将无法验证模型驱动的操作。
  • 显示您的自定义验证以及如何使用它。

标签: validation struts2


【解决方案1】:

注意:请去掉selfISDN_num中的_下划线

检查正确的 jar 文件。

Xwork:核心 2.3.16.2 API

检查 getter 和 setter

注意:请检查struts.xml中的包名,是否扩展struts-default

<package name="Registration" namespace="/" extends="struts-default">
... 
</package>

【讨论】:

  • @Partha:请参阅我的堆栈已经包含默认堆栈,该堆栈已经具有 paramsPrepareStack 和 validationWorkflowStack,因此我无需再次包含这些拦截器(我也尝试过,但它不起作用) .
  • 你的 xml 名称是什么? ActionName-validation.xml?
  • 它的 NodeAction-validation.xml
  • 您是否在控制台中收到任何错误?你把NodeAction-validation.xml 放在哪里了?将其放在与操作的包名称相同的包名称中很重要。
  • 在你的jsp中nodeId的name属性是什么?是name="nodeId"name="selfISDN_num" 吗?
【解决方案2】:

终于找到问题所在了。 在 validaiton.xml 中指定的 DTD 是错误的。指定的 DTD 用于 2.3 及更高版本。我使用的是较低版本的struts。 我现在正在使用

 <!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2016-01-18
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多