向Grails restfulcontroller添加功能

时间:2013-10-14 12:45:09

标签: rest grails

我有一个非常简单的restful控制器,看起来像这样:

class PersonController extends RestfulController<Person> {

    static responseFormats = ['json', 'xml']

    PersonController() {
        super(Person)
    }
}

但是,现在我想为此添加一个搜索选项。什么是Grails使这成为可能的方式?

我想添加以下内容:

def search(Map params) {
    println params
}

但这会让Grails(2.3)崩溃(|编译期间出现错误致命错误org.apache.tools.ant.BuildException:编译失败(使用--stacktrace查看完整跟踪))。

那么添加这个的正确方法是什么?我正在寻找一些可以使用http://localhost:8080/foo/person/search?q=erik

调用的解决方案

这是我的UrlMappings:

static mappings = {
    "/$controller/$action?/$id?(.${format})?"{
        constraints {
            // apply constraints here
        }
    }


    "/rest/persons"(resources:'Person')

我已将上述内容更改为:

def search() {
    println params
}

这不再给出编译错误,但我仍然会收到此错误:

TypeMismatchException occurred when processing request: [GET] /declaratie-web/rest/medicaties/search - parameters:
q: erik
Provided id of the wrong type for class nl.Person. Expected: class java.lang.Long, got class java.lang.String. Stacktrace follows:
org.hibernate.TypeMismatchException: Provided id of the wrong type for class nl.Person. Expected: class java.lang.Long, got class java.lang.String

我还发现我如何调用控制器并不重要:

http://localhost:8080/foo/person/search?q=erik
http://localhost:8080/foo/person/search222?q=erik
http://localhost:8080/foo/person/search39839329?q=erik

所有失败都出现上述错误,所以似乎忽略了我的方法(可能是由我的URLmapping引起的?)

2 个答案:

答案 0 :(得分:2)

这样做真的不是RESTful。 q应该只是索引操作的参数。您可以覆盖该方法以包含您的功能。

def index(Integer max) {
    params.max = Math.min(max ?: 10, 100)
    def c = Person.createCriteria()
    def results = c.list(params) {
       //Your criteria here with params.q
    }
    respond results, model:[personCount: results.totalCount]
}

答案 1 :(得分:0)

@ james-kleeh解决方案是正确的,但您可以通过覆盖listAllResources

调用的index方法来做得更干净
@Override
protected List<Payment> listAllResources(Map params) {
    Person.createCriteria().list(params) {
        // Your criteria here with params.q
    }
}