春季-RESTful提供不同的实体表示形式

时间:2019-06-27 06:27:23

标签: spring rest spring-boot jpa

预先,我不是说Content Negotiation。假设我有一个简单的JPA实体,通过它可以与相关DTO转换的方式无关紧要。

@Entity
public class User {

    ...
    private String email;
    private String password;
    ...
}

我有一个RESTful控制器,它具有两种不同的路由,即安全路由和公共路由。

@RestController
public class UserController {

    ...

    @GetMapping("/public")
    private User publicRoute() {

        return service.getLatestUser();
    }

    @Secured("...")
    @GetMapping("/private")
    private User privateRoute() {

        return service.getLatestUser();
    }
}

对于这两种路线,返回的都是相同的实体,但在第一种情况下,是公开表示,例如对于用户个人资料,没有诸如电子邮件密码应该返回。但是,在第二种情况下,需要所有者的私人代表。

有什么优雅的方法吗?我使用@JsonIgnore在JSON级别上尝试了它,但对我来说不起作用。我也尝试使用Response-Objects,但这会导致很多样板代码!有什么建议吗?

另请参见:Ananthapadmanabhan推荐,已经有一些关于此主题的问题/资源:

3 个答案:

答案 0 :(得分:2)

从两个终结点返回不同的DTO对象,而不是返回相同的Entity类,这样您就可以控制响应中应该包含哪些属性。

阅读here,了解使用DTO的优点

您可以采用的另一种方法是为端点设置自定义序列化器和反序列化器。 您可以阅读here了解更多详细信息。 还有here

答案 1 :(得分:0)

在发送回控制器时忽略dto字段。

如果您的对象不是最终对象,则可以编写自己的方法 私有用户ignoreEmailAndPass(用户用户){User usr = new User(); usr.setName(); //仅发送必填字段。}

答案 2 :(得分:0)

来自问题:

  1. 在数据库表中,您可以扮演两个角色
  2. 像用户和所有者一样说 3.在服务中,检查它是用户还是所有者,并获取所需的详细信息,然后输入 两个DTO,为您要发送的每个DTO设置信息并返回。
  3. 或者拥有一个通用的DTO,包含所有信息,并且当要发送用户信息时,只需忽略其他信息{Subset},即可。

告诉我您对此解决方案有何看法?