挥之不去的噩梦,struts2 rest 的通病

话说前天碰到的问题,已经被一个好心的eye友给轻松解决了。真的非常感谢。
但今天又碰到一个问题。
而且跟前天碰到的其实应该是一类问题。

前天问题的解决方法,其实是换了一种途径。但我当时想用的方法为什么不行,我还是不清楚。
@Action(interceptorRefs={@InterceptorRef("authorization"), @InterceptorRef("restDefaultStack")})
    public String update() {
        ordersService.save(model);
        addActionMessage("Order updated successfully");
        return "success";
    }

就是说,拦截器不能直接加在 method level 上面,而只能加在 Action.class级别。
问题的原因不清楚,但我想或许与没有指定 @Action(value="xxx")的value值有关!

如果只是使用struts2 的 convention 插件,当然可以指定value,但是rest方式下,标准的那7个方法如何指定别名呢?即便能够指定,也很奇怪!

为何说今天遇到的问题类似。因为我在完善action的返回值的处理的时候,发现Result竟然也无法加在method level上,而只能是 action.class上,与拦截器的问题一样。

代码如下:

  @Action(
        results={@Result(name="exception", type="httpheader", params={"status", "503", "errorMessage", "Internal Error"})}
    )
    public HttpHeaders show() {
        int i = 1/0;
        return new DefaultHttpHeaders("show").disableCaching();
    }
   
    @Action(results={@Result(name="exception", type="httpheader", params={"status", "504", "errorMessage", "Internal Error"})})
    public HttpHeaders index() {
        int i = 1/0;
        list = ordersService.getAll();
        return new DefaultHttpHeaders("index").disableCaching();
    }

与官方文档对照再三,唯一的区别就是我没有指定 @Action 的 value 属性。
给上面这段代码的 @Action 加上 value 属性,果然不出所料。

本来下面的url可以访问某个order:
/orders/3.xml
如果添加了value,就只能写成:
/orders/show/3.xml   --> @Action(value="/orders/show/")

这还叫rest么?

不明白,难道 struts2 rest plugin 就没办法指定 method level 的 Result 么?还有拦截器,也有这个问题。其实还有异常声明,也是。@ExceptionMapping也没法直接加在method level上,官方文档说行,那也是 Convention plugin ,换成rest,都不行了。

难道一点辙都没了?那我的程序该咋办啊,异常处理/返回结果值处理 都没法弄了。。。
狂晕中,老板让俺今天把这块儿东西做完,可是这个问题就像钉在那里一样,一点都无计可施。。。我的希望全寄托在mht19840918老兄身上了,盼大师能给在下指点一下迷津!

你可能感兴趣的:(json,xml,Ajax,XHTML,REST)