【问题标题】:Jersey Resource class interaction?Jersey 资源类交互?
【发布时间】:2010-02-04 04:32:46
【问题描述】:

所以,我正在快速了解泽西岛并提出一个“最佳实践”问题。应将资源自包含在一个文件中的严格程度。如果需要,一个资源类是否应该引用另一个类?

一个例子:

我有一个人员资源和一个约会资源。 (即:/Person/1 & /appointment/12345)。我还可以执行 /Person/1/Appointments 之类的操作来列出第 1 个人的所有约会。

所以,我的问题是我应该在 Person Resource 类中实现一个方法 getPersonAppointments(),还是只是让某人获得对 Appointment 资源类的引用并调用该方法,将所有返回“Appointments”的方法保持在一起。

我不知道有正确或错误的方式。

【问题讨论】:

    标签: java jersey


    【解决方案1】:

    由于一个约会有多个人,一个人有多个约会,情况是对称的,你必须突破人员和约会之间的障碍。

    【讨论】:

      【解决方案2】:

      您的 REST API 应该简化对资源的访问。 REST 的原则之一是“超媒体作为应用程序状态引擎”的思想,它更喜欢通过 URI 将客户端引导到相关资源,这样客户端就不需要知道如何为某些资源构建 URI。先验的。

      更多信息在这里:http://en.wikipedia.org/wiki/HATEOAS

      对 /person/1 的请求应返回有关该人的信息,包括约会 URI 的集合。然后,客户端可以请求这些 URI 中的任何一个来获取有关每个约会的信息。实现 /person/1/appointments 是多余的。

      【讨论】:

        【解决方案3】:

        在您的场景中,我会将用于加载人员约会的逻辑放在一个资源中,并使其可以从另一个资源访问(换句话说,委派资源,我假设您已经在做)。实际逻辑存储在 AppointmentService 中,因此您可以将其与 getPersonAppointments() 一起使用。

        这样就可以调用了:

        • /person/1/约会
        • /appointments?personId=1

        两者都会产生相同的响应。 这可能不是最佳实践,但逻辑在一个地方,使其更具可读性和可重用性。

        @Path("person")
        public class PersonResource {    
            @GET
            @Path("{personId: [0-9]+}/appointments")
            public AppointmentsResource loadAppointmentsForPerson(@PathParam("personId") Long personId) {
                return new AppointmentsResource(personId);
            }
        }
        
        @Path("apointments")   
        class AppointmentResource {
        
            private AppointmentService service;    
            private Long personId;
        
            public AppointmentResource() {
            }
        
            public AppointmentResource(Long personId) {
                this.personId = personId;
            }
        
            @GET
            public Response loadAppointmentsForPerson(@QueryParam("personId") Long personId) {
        
                Long personIdToUse = null;
                if (this.personId != null) {
                    personIdToUse = this.personId;
                } else if (personId != null) {
                    personIdToUse = personId;   
                } else {
                    //no input, bad request
                }
        
                List<Appointment> appointments = service.getPersonAppointments(personIdToUse)
                //create your response from appointments
            }
        }
        

        当然,在您的 AppointmentResource 中,您还会有其他内容,例如按特定 ID 加载约会。

        【讨论】:

          猜你喜欢
          • 2011-12-20
          • 1970-01-01
          • 1970-01-01
          • 2010-09-12
          • 1970-01-01
          • 2011-11-19
          • 2016-01-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多