【问题标题】:Struts 2 convert errorStruts 2 转换错误
【发布时间】:2011-07-20 12:00:33
【问题描述】:

我在struts 2中创建了一个动作

class MyAction extends ActionSupport {
    private List<User> users;
    //getters and setters users
    public String execute(){
       users=//code to get users;
       return SUCCESS;
    } 
}

我用 url /MyAction 映射了这个动作类,成功的结果是一个 jsp,它在我打开 url 时显示用户:

http://localhost:8080/MyAction.action

当我打开页面时:

http://localhost:8080/MyAction.action?xyz=123

我没有收到任何错误。但是当我打开页面时:

http://localhost:8080/MyAction.action?users=123

Struts 尝试调用setUsers() 方法,但未能将 123 转换为用户列表。因此我得到一个转换错误。

由于该操作不需要任何参数,因此它的行为方式应该与提供的所有额外参数相同。它不应该只忽略少数并为其他人显示错误。

对于这个问题,我能够找到的解决方案是将所有 setter 方法设为私有,但预期参数的 setter 除外。

谁有更好的解决方案?

【问题讨论】:

  • 您在调用 action?users=123 时强制调用 setUsers()。你自己已经回答了大部分。为什么还要用这个查询字符串调用操作?
  • 感谢您的回复。我只是想保护我的网站免受讨厌的用户的侵害。

标签: validation struts2


【解决方案1】:

您可以使用ParameterNameAware

上面的链接应该让用法清楚。

尽管正如 anu 所建议的,您的操作通常是一个公共接口。 Struts2 公开 setter 是为了方便,而且很有说服力。您应该只有设置器用于输入。然后,该操作在另一层(业务)完成所有工作,该层通常反过来使用另一层(或您喜欢的层)来访问持久数据。您可能知道这一点,但仅将适当的内容放在操作层中,生活就会变得不那么复杂(您的问题永远不会出现)。

【讨论】:

    【解决方案2】:

    阿努是对的。我认为您要修复的不是问题,而是框架的功能本身。

    【讨论】:

      【解决方案3】:

      感谢您的回复。我知道这是 struts 功能,但我要指出的是,如果 struts 忽略其他参数(没有设置器),它应该忽略操作不需要的所有参数。但是是的,应该有一些方法可以指定可接受的参数列表。

      正如 Quaternion 指出的,ParameterNameAware 是一种解决方案,但当动作类中只有一个动作方法或所有动作方法必须接受相同的参数列表时,此方法有效。

      我找到了另一种使用 params 拦截器为每个操作指定可接受参数列表的方法。

      <action name="xxx" class="yyy" method="action1">
         <intercecptor-ref name="defaultStack">
           <param name="params.excludeParams">regex</param>
         </intercecptor-ref>
         <!-- other code -->
      </action>
      

      代替正则表达式,您指定排除参数的正则表达式,但您的表达式未排除的参数除外。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-03
        • 2012-12-10
        相关资源
        最近更新 更多