【问题标题】:Grails mongodb map type gives illegalStateExceptionGrails mongodb 地图类型给出了非法状态异常
【发布时间】:2014-03-22 17:23:34
【问题描述】:

我正在尝试将地图属性添加到用户域

class User {
    String id
    String username
    String password
    ....
    Map<String, Follower> followers
    //i've tried also without embeded and got the same error. also tried follower insead of followers
    static embedded = ['followers']
}

class Follower {
    String name
    List<String> interests
}

我有一个实现保存方法的restful控制器

@Transactional
@Secured(['permitAll'])
def save(User user){
    user.id = new ObjectId().encodeAsBase64()
    user = user.insert(flush: true)
    respond 
}

很遗憾我遇到了一个例外:

java.lang.IllegalStateException: Cannot convert value of type [com.google.gson.JsonObject] to required type [Follower] for property 'followers[532dbe3b8fef86ebe3e64789]': no matching editors or conversion strategy found Around line 26 ofUserController.groovy

第 26 行是:user = user.insert(flush: true)

json 请求示例:

{
    username : "roy",
    password : "123456",

    followers : {
        "532dbe3b8fef86ebe3e64789" : {
            name : "Roy",
            interests : ["math"]
        }
    }
}

任何帮助将不胜感激

谢谢!

罗伊

【问题讨论】:

    标签: java mongodb grails grails-orm


    【解决方案1】:

    您正在尝试将 JSONObject 保存为 Follower 实例。解决问题的直接方法是手动将它们转换为 Follower 实例:

    def save(User user){
      user.id = new ObjectId().encodeAsBase64()
      user.followers = user.followers.collect{ new Follower( it ) }
      user = user.insert(flush: true)
      respond 
    }
    

    如果你有更多这样的情况,你应该注册一个属性编辑器来转换 JSON Follower

    【讨论】:

    • 感谢@injecteer 的回复。 gson 不应该自动将 json 对象编组到 Object 中吗?我如何获得 GroovyRuntimeException 找不到匹配的构造函数。也收集返回一个列表而不是地图,但也许我只是错过了一些东西
    • @royB 这是否意味着您现在遇到了不同的错误?如果是这样,您能否更新问题以反映这一点?
    • 我认为 gson-parser 不能对 hashmap 进行深度编组。它仅适用于原始类型,而不是更多。您的无构造函数异常意味着您需要在每个类中定义一个默认的无参数构造函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多