【问题标题】:Grails fail to receive serialized dataGrails 无法接收序列化数据
【发布时间】:2015-04-24 03:25:02
【问题描述】:

如何在 grails 控制器中发送数据(JSON 或 XML)并对其进行反序列化?

我试过render paramsrender request.JSON 给我返回了空的json,还有命令方法

import grails.converters.JSON

class TestController {

    def test(RestCommand r){
        render r as JSON
    }

}

class RestCommand {
    String data

    static constraints = {
        data nullable: false
    }

}

女巫导致

{"data":null,"errors":{"errors":[{"object":"x.x.RestCommand","field":"data","rejected-value":null,"message":"Property [data] of class [class x.x.RestCommand] cannot be null"}]}}

这是我的 curl 请求:

curl -X POST --header "Content-Type:application/json" --data '{"id":1}' localhost:8080/myApp/myController/myMethod

附:我在 stackexchange 中查看过类似的问题,但正如我上面所讨论的,这些方法都不起作用。

【问题讨论】:

  • 您的命令对象包含一个名为 data 的字符串,并且您正在发送一个 id 作为数字。如果您render r as JSON 并发送正确的数据({"data":"somestring"},上面的示例可以正常工作
  • 对于没有RestCommanddef myMethod()render request.JSON 也可以正常工作。你能显示更多你的控制器的代码吗?
  • @PawełPiecyk 给你,检查我的编辑。问题可能与 grails 配置有关吗?
  • @cfrick 如果你也检查我的更新,那就太好了。
  • 错误信息不是很有意义吗?你说你想要一个字符串data,它不允许有null 值。然后您发布缺少 data 的 json 并得到一个错误告诉您。

标签: java xml json grails model-view-controller


【解决方案1】:

Grails 为您提供序列化对象,您的数据只需与命令具有相同的字段即可。

这对我有用:

import grails.converters.JSON

class TestController {

    def test(RestCommand r){
        if(r.hasErrors()) {
           render (
               status: 400, 
               text: r.getErrors() as JSON)
        } else {
            render "id: "+r.id+" data: "+r.someData
        }
    }

}

class RestCommand {
    Integer id
    String someData

    static constraints = {
        id nullable: false
    } 

}

这是请求:

curl -X POST --header "Content-Type:application/json" --data '{"id":1,"someData":"here you go some data"}' localhost:8080/myapp/test/test

结果:

id: 1 data: here you go some data

【讨论】:

    【解决方案2】:

    他们的工作方式是有效的(将 JSON 发送到控制器并反序列化)。如果您将 JSON 发送到此操作,该命令将绑定接收到的数据(就像在您的示例中那样)。您的问题是您的 curl 测试中的数据无效。通常,您会检查命令是否有错误,例如:

    def test(RestCommand r){
        if(r.hasErrors()) {
           // handle error
           response.status = 400
           render "error"
           return
        }
        render "ok"
    }
    

    【讨论】:

    • 数据不是无效的,它是不存在的。如果您将 cmets 红色并检查数据,您会看到答案类似于“命令不携带 json 字符串,而是反序列化对象,因此如果您传递 id,则命令必须具有一个叫‘id’的成员”
    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多