如何在POST / PUT RESTful webapp上合并JPA实体结构

时间:2013-07-02 21:27:19

标签: json rest jaxb jax-rs resteasy

我开始为现有的JSF-webapp实现REST层(使用RESTEasy,使用Jettison提供程序)。由于Java REST层的教程非常基础(简单对象),因此我面临的问题是如何轻松地从客户端公开/消费现有的JPA实体关系。一个简单的“/ user”REST方法已经成功地给了我下面的输出,这是一个好的开始。但我的主要问题是 - 如何处理这种结构。通过REST使用这样的结构是否常见?

  1. 我不希望公开所有细节或整个实体树,因为它不相关,节省了流量或安全问题。使用@XmlTransient对@Procudes工作正常,但是在@POST / @PUT上合并这些实体所有@XmlTransient属性都合并为NULL。这样做的正确方法是什么?
  2. 由于@XMLTransient是一个全局且永久的设置 - 动态决定我想要公开哪个实体树深度的正确方法是什么?
  3. 谢谢

    用户实体的JSON示例:

    {
     "user": {
        "id": ..,
        "uuid": "1521ccad69ba4579bbe49e75181fefc1",
        "image": "",
        "contact": {
            "id": ..,
            "uuid": "8eb429dcca994834ae5c8cf07cba62a2",
            "cellphone": "",
            "city": "",
            "country": "",
            "email": "mail@foo.bar",
            "fax": "",
            "phone": 555,
            ...
        },
        "name": "...",
        "account": {
            "id": ...,
            "uuid": "80b331f9e6644449bb3600b0e5145253",
            "confirmed": true,
            "profile": {
                "id": ...,
                "uuid": "e172bdcafe2645d7975852ca5685c98c",
                "locale": "en",
                "notifyMessage": false,
                "notifyNews": true,
                "notifyTask": true,
                "timeZone": "Europe/Berlin"
            },
            "roleProfiles": {
                "id": ..,
                "uuid": "f1713758f3f2416faed3e68350f2d759",
                "active": true,
                "assemblies": [
                    {
                        "id": ..,
                        "uuid": "13d72449833a4eb0b5b4f62c729ee44f",
                        "image": "",
                        "commercialRegisters": [
                            123,
                            456
                        ],
                        "contact": {
                            "id": ...,
                            "uuid": "bef3802297344e3c8c3619b6c91c345a",
                            "city": "",
                            "country": "",
                            ...
                        },
    
                        "thumbnail": ""
                    },
                    {
                       ...
                    }
                ],               
            },
            "userName": "..."
        },
    
        "displayName": "...",
        "firstName": "Foo",
        "lastName": "Bar",
        "salutation": "",
            "title": ""
        }
    }
    

1 个答案:

答案 0 :(得分:0)

您的Java类中的引用应该作为链接而不是值序列化为JSON。 这就是Spring REST的功能。 好消息是:那样你就有了一种懒惰的装载方式 不好的是客户需要额外的请求来获取引用的值。

我为此开发了一个完整的解决方案,但这是一项艰巨的工作。 客户端(在javascript中)为这些引用创建代理并根据需要解析它们。

我在demo.appdriver.com上有一个演示 在右上角,您会看到一个链接'REST API',点击它,您可以看到相当复杂的域模型的REST API。

现在您可以开始点击用户界面,创建,更改,删除等。 并查看客户端和服务器之间的流量。

希望它有所帮助!