java - 如何使用 List<Entity> 以外的多个属性在 Spring 中返回自定义响应

标签 java spring spring-boot spring-restcontroller

我正在尝试从 spring rest Controller 返回给用户的自定义响应,其中包含所有注册用户的列表和其他键(例如成功等)。 我尝试了以下方法,但 Json 数组被完全转义为字符串...

@GetMapping(value = "/workers", produces = "application/json;charset=UTF-8")
public ResponseEntity<String> getAllWorkers() throws JSONException {
    JSONObject resp = new JSONObject();
    ObjectMapper objectMapper = new ObjectMapper();

    HttpStatus status;
    try {
        ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
        List<Worker> workers = workerservice.getAllworkers();
        String json = mapper.writeValueAsString(workers);
        
        resp.put("success", true);
        resp.put("info", json);
        status = HttpStatus.OK;
    } catch (Error | JsonProcessingException e) {
        resp.put("success", false);
        resp.put("info", e.getMessage());
        status = HttpStatus.INTERNAL_SERVER_ERROR;
    }

    return new ResponseEntity<>(resp.toString(),status);
}

我得到了这样的东西

{
    "success": true,
    "info": "[ {\n  \"id\" : 3,\n  \"password\" : \"abcdefg\", \n  \"tasks\" : [ ], (...) ]"
}

想要这样的东西:

{
    "success": true,
    "info": [ 
        {
           "id" : 3,
           "password" : "abcdefg",
           "tasks" : [ ]
        },
        (...) 
    ]"
}

有什么方法可以在请求后正确显示 json 数组?

最佳答案

您可以让 Spring Boot 处理响应实体的序列化。

创建一个定义响应对象的 POJO。

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class WorkerPojo {
    @JsonProperty("success")
    private boolean success;
    @JsonProperty("info")
    private List<Worker> workerList;
    @JsonProperty("message")
    private String message;

    // A default constructor is required for serialization/deserialization to work
    public WorkerPojo() {
    }
    
    // Getters and Setters ....
}

这可以让您稍微简化 getAllWorkers 方法:

@GetMapping(value = "/workers", produces = "application/json;charset=UTF-8")
public ResponseEntity<WorkerPojo> getAllWorkers() throws JSONException {
    WorkerPojo response;
    try {
        List<Worker> workers = workerservice.getAllworkers();
        return new ResponseEntity<>(new WorkerPojo(true, workers, "OK"), HttpStatus.OK);
    } catch (Error e) {
        return new ResponseEntity<>(new WorkerPojo(false, null, e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

请注意,我为错误消息添加了一个单独的消息字段。我发现如果特定字段不用于不同类型的数据,客户会更开心。 “info”永远不应是工作人员列表,“message”永远不应是字符串。

免责声明:我没有 Spring Boot 项目设置来正确测试它。如果有问题请告诉我,我会检查。

关于java - 如何使用 List<Entity> 以外的多个属性在 Spring 中返回自定义响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65382348/

相关文章:

java - 几个小时后,Google 表格 java sdk oAuth 未经授权( Spring 启动)

spring - 如何在 Spring Boot 应用程序中注入(inject) Prometheus 指标 bean?

java - 阻塞队列、单个生产者-多个消费者同步问题

Java MySQL 连接

java - 来自不同类的对象的 ArrayList

java - 从 Spring Boot 1.5.4 升级到 2.0.0 的问题

java - spring是如何管理session的?

java - WebClient (spring-boot-starter-webflux) 向错误的 url 发送请求

java - 在 JFrame 中显示透明 GIF,而不在播放时保留每一帧? (初学者)

java - 使用 Eclipse 为 Android 加载 native 库