【问题标题】:Returning a message for the client in json format along with data - Java/Spring/REST以 json 格式为客户端返回一条消息以及数据 - Java/Spring/REST
【发布时间】:2020-04-04 10:19:35
【问题描述】:

我想返回一条自定义消息以及我的端点应该以 json 格式返回的数据。例如:

{
 "id": "1",
 "name": "John",
 "surname": "Jackson",
 "city": "Los Angeles"
 "message": "There was only 1 person in chosen category"
}  

所以我的 POJO 类的人有字段:id、name、surname、city。但是我也想返回消息,以便客户端应用程序可以在前端显示消息。我一直在寻找解决方案。默认情况下,控制器端点可以将对象作为 json 返回没有问题。但这只是给了我数据,200 个状态,仅此而已。我发现了关于返回 ResponseEntity 的信息,但这也不能解决问题,因为在响应正文中它需要一个 POJO,所以我仍然无法将自定义消息与数据一起发送。我需要发送自定义消息、数据和适当的状态代码。

【问题讨论】:

  • 创建一个新类,该类包装您的类的实例并具有message 属性并改为返回它的实例。

标签: java json spring rest httpresponse


【解决方案1】:

您可以创建一个从控制器返回的通用类,该类将使用message 属性丰富您的模型:

public class ServerResponse {
    @JsonUnwrapped
    private final Object wrapped;
    private final String message;

    public ServerResponse(Object wrapped, String message) {
        this.wrapped = wrapped;
        this.message = message;
    }
    //getters
}

然后你可以在构造函数中将任何对象传递给这个类,让Jackson为你处理序列化。这样您就不必为每个模型创建一个新类:

User user = new User("1", "John", "Jackson", "Los Angeles");
ServerResponse serverResponse = new ServerResponse(user, "There was only 1 person in chosen category");

当您从控制器返回 ServerResponse 时,它将被序列化为:

{
   "id":"1",
   "name":"John",
   "surname":"Jackson",
   "city":"Los Angeles",
   "message":"message"
}

【讨论】:

    【解决方案2】:

    尝试创建具有 id、name、surname、city、message 字段(getter 和 setter)的新助手类(CustomUser)。在向您发送控制器上的用户(具有属性的新用户)时,创建 CustomUser 类的新实例,设置属性并发送 customUser, 像这样:

    CustomUser customUser = new CustomUser();
    customUser.setId(user.getId);
    customUser.setName(user.getName);
    customUser.setSurname(user.getSurname);
    customUser.setCity(user.getCity);
    customUser.setMessage("Custom message");
    

    【讨论】:

    • 我理解这个想法,但是如果我返回多个模型/DTO,我将不得不为它们中的每一个创建一个辅助类。我想知道一个解决方案,我想知道我认为是否正确。如果我创建一个具有一个字段的抽象类:消息,然后我的模型/DTO 类将从它派生。默认情况下,我将在每个班级中都有消息字段。如果我将该消息字段设置为瞬态(使用 JPA 表示法),它不会将其保存到数据库中,但我将能够使用它来发送消息。我在吗?
    • 是的,这种方法是正确的。你也可以有一个通用的方法来准备响应。
    【解决方案3】:

    您可以使用@MappedSuperclass 和@Transient 来解决您的需求。

    因此你会有一个这样的基类:

    @MappedSuperclass
    @Data
    public class BaseEntity {
    
        @Transient
        private String message; 
    
    }
    

    您的客户类别如下所示:

    @Data
    @EqualsAndHashCode(callSuper = false)
    @Entity
    @Table(name = "customer")
    public class Customer extends BaseEntity {
    
        @Id
        private Integer id;
        private String name;
        private String surname;
        private String city;
    }
    

    通过这种方式,您可以将此字段添加到您的所有实体。

    【讨论】:

      猜你喜欢
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2018-01-24
      • 2011-06-13
      • 2017-02-24
      • 1970-01-01
      相关资源
      最近更新 更多