Struts 2转换错误

时间:2011-07-20 12:00:33

标签: validation struts2

我在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。

有没有人有更好的解决方案?

3 个答案:

答案 0 :(得分:1)

您可以使用ParameterNameAware

以上链接应明确用法。

虽然正如anu所暗示的那样,你的行动通常是一个公共界面。 Struts2为了方便而暴露了setter,并且很有说服力。你应该只有输入的setter。然后,该操作在另一层(业务)上完成所有工作,该层通常依次使用另一层(或层,如果您愿意),它访问持久数据。你可能知道这一点,但只是在动作层中放置适当的东西,生活变得不那么复杂(你的问题永远不会出现)。

答案 1 :(得分:0)

Anu的权利。我认为你要解决的问题不是问题,而是框架的功能本身。

答案 2 :(得分:0)

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

正如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>

代替正则表达式,指定除了表达式不能排除的参数之外的正则表达式。