【问题标题】:How to create custom methods using Struts2 REST plugin如何使用 Struts2 REST 插件创建自定义方法
【发布时间】:2014-11-02 17:49:58
【问题描述】:

我的问题涉及在操作中创建自定义方法。我正在使用 Struts2 和 REST 插件来实现 RESTful WebService。我的动作类如下:

public class SampleController implements ModelDriven<Object> {

private Sample sample = new Sample();
private Collection<Sample> list;
private int id;

public HttpHeaders create() {
    sdao.save(sample);
    return new DefaultHttpHeaders("create");
}   


public HttpHeaders destroy() {
    return new DefaultHttpHeaders("destroy");
}

public HttpHeaders show() {
    return new DefaultHttpHeaders("show").disableCaching();
}

public HttpHeaders update() {
    sdao.save(sample);
    return new DefaultHttpHeaders("update");
}

public HttpHeaders index() {
    list = sdao.findAll();
    return new DefaultHttpHeaders("index").disableCaching();
}

public Object getModel() {
    return (list != null ? list : sample);
}


public int getId() {
    return id;
}

public void setId(Integer id) {
    if (id != null) {
        this.sample = (Sample) sdao.findById(id);
    }
    this.id = id;
}

}

我可以通过GET HTTP 方法正确访问资源。为了使用自定义方法,通过传递参数来调用搜索资源,即

public searchBySenderName(String senderName) {
    list.addAll(sdao.findBySenderName(senderName))
}    

正确的程序是什么?我如何通过GET以下网址调用它?

【问题讨论】:

    标签: java rest struts2 model-driven struts2-rest-plugin


    【解决方案1】:

    在您的情况下,您可以从GETindexshow)的任何预定义方法调用自定义方法,请参阅RESTful URL mapping logic

    RESTful URL 映射逻辑

    这个 Restful 动作映射器强制执行 Ruby-On-Rails REST 样式的映射。 如果未指定方法(通过 '!' 或 'method:' 前缀),则 方法在使用 REST 风格的约定来检查 URL 和 HTTP 方法。已给予特别注意以确保这一点 映射器与代码隐藏插件一起正常工作,以便 XML 无需配置。


    当然,您可以更改动作映射器使用的方法名称,但这会影响整个应用程序。如果您已经占用了一个资源 URL,那么您应该使用另一个来执行它的工作。这是在您使用严格的rest 映射器的情况下。在mixed mode 中,您可以将常用操作映射到某个操作方法。

    REST 和非 RESTful URL 的共同配置

    如果您想在 REST 旁边继续使用一些非 RESTful URL 东西,那么你必须提供一个配置,利用 给映射器。

    插件包含自己的配置。如果你看剩下的 插件 jar,您将看到 struts-plugin.xml 并在其中看到 插件所做的一些配置设置。通常,插件只是 按照它想要的方式设置事物。您可能经常需要覆盖 这些设置在您自己的struts.xml 中。


    最后,您可能不会通过 !method: 前缀指定方法,因为它受到默认配置的限制。

    【讨论】:

    • 非常感谢。但是我怎样才能调用我的自定义方法呢?我没有找到正确的 URL 路径 :-(
    • 你不需要它,URL是按约定定义的,但是你需要一个控制器。
    • 再次感谢您。这对我来说仍然是一个谜。我实现了这样的方法: public String test() { list = sdao.findBySenderName("raspberrypi-0");返回“测试”;但是我可以通过传递一个 id 资源(即 MyProject/sample/24/test.xml)来查看结果我可以有一个明确的例子吗?
    • 当然,download struts2 示例应用程序并查看 struts2-rest-showcase 应用程序,这是一个完整的 WAR 文件,它演示了一个简单的 REST Web 程序。
    最近更新 更多