连接表的Spring REST API响应

时间:2017-05-19 18:42:25

标签: java json spring rest

我在Tomcat上运行MySQL DB和SpringBoot应用程序。这是我的个人项目,也是我设计REST服务的第一次经历。我一直在尝试创建我的POJO以匹配数据库,但这个特定的对象产生了一些疑问。

以下是主要数据库表:

  • 播放器(id,description)
  • 广告系列(ID,说明)
  • 资源(id,description,resource_type_id)
  • resource_type(id,description)
  • 组件(id,description)

...以及以下联结表:

  • player_resource(id,player_id,resource_id):玩家可能拥有许多资源,资源可能属于许多玩家。
  • campaign_resource(id,campaign_id,resource_id):广告系列可能包含许多资源,资源可能属于多个广告系列。
  • resource_component(id,resource_id,component_id):资源可能包含许多组件,组件可能属于许多资源

我特别想知道如何设计我的JSON响应以及专门针对Resource对象的相应POJO。

我到目前为止所想的是有三个单独的URI:

  1. ... / api / resources / {uuid} :返回特定资源。
  2. ... / api / campaigns / {uuid} / resources :返回所提供广告系列中可用的资源。另外,玩家存在于广告系列的范围内,因此这个特定的API最终决定了玩家在其存在过程中可以获得的内容。
  3. ... / api / players / {uuid} / resources :返回玩家目前在其广告资源中拥有的​​资源。
  4. 我为资源创建了一个POJO:

    public class Resource {
    
        private String resourceId;
        private String shortDescription;
        private String longDescription;
        private ResourceType resourceType;
        private List<Component> components;
    
        // getters and setters
    
    }
    

    我为CampaignResource和PlayerResource创建了两个额外的POJO:

    public class CampaignResource {
    
        private String campaignResourceId;
        private Resource resource;
    
        // getters and setters
    
    }
    
    public class PlayerResource {
    
        private String playerResourceId;
        private Resource resource;
    
        // getters and setters
    
    }
    

    我希望URI#1和#2返回相同的布局,但我对URI#3有冗余问题。 URI#2可以返回10个很好且预期的资源,但URI#3可以返回数百个,具体取决于玩家携带的内容。

    调用URI#3时我真正需要的唯一信息是player_resource_id,resource_id和resource_type_id字段。我不需要知道哪些组件构成了资源,因为使用URI#1或URI#1以更易于管理的方式恢复该信息。

    我害怕创建单独的&#34; base&#34;资源POJO因为我觉得有义务遵循某种形式的规范建模。我可以使用像JsonView这样的东西,根据它的URI#1,#2还是#3来分离Resource RowMappers?我可以实现某种形式的分页,但它仍然有很多冗余数据。经验丰富的REST开发人员如何处理这个问题?

2 个答案:

答案 0 :(得分:0)

为什么需要为每个REST API创建包含资源的单独类。只需返回#1的一个资源和#2和#3的资源列表。

答案 1 :(得分:0)

我认为如果您想了解RESTful API的this post将会有很大帮助。特别是关于您的要求,请查看主题限制API返回哪些字段

  

使用字段查询参数,该参数采用逗号分隔的字段列表来包含。

例如:

GET /tickets?fields=id,subject,customer_name,updated_at&state=open&sort=-updated_at

Here您可以找到Google,Facebook和LinkdIn的作用。

[]中