忽略POST请求的JSON字段,但不应忽略GET请求

时间:2019-02-18 23:08:22

标签: java json spring spring-boot spring-mvc

我是Spring Boot框架的新手。我有一个如下模型:

   public  class Process{
   private String processId;
   private ProcessStatus status;
   private hostname;
   private errorMessage;
}

发布来自控制器的呼叫:

@RequestMapping(value = "/process", method = RequestMethod.POST,
                    consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE })
    public HttpStatus updateProcess (@RequestBody Process process)
    {
        try {
            processService.updateProcess(process);
            return HttpStatus.OK;
        } catch (Exception e) 
            throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR,e,
                e);
        }
    }

致电该流程:

@RequestMapping(value = "/process", method = RequestMethod.GET,
                    produces = { MediaType.APPLICATION_JSON_UTF8_VALUE })
    public Process getProcess (@RequestParam("processId") String processId)
    {
        try {
            return processService.getProcess(processId);
        } catch (Exception e) {
            throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR,
                e);
        } 
    }

因此,组件A正在执行发布,该组件A负责更新有关流程的信息。 组件B正在完成获取以获取现有进程。 问题:如何隐藏get的主机名和errorMessage,而不隐藏帖子。当我不使用@JsonIgnore时,它将同时忽略这两个请求。

2 个答案:

答案 0 :(得分:0)

最简单的方法是使用另一个DTO(数据传输对象)类,该类不包含您不希望发送回的字段。在您的情况下,这意味着要创建一个ProcesDTO类,如下所示:

public class ProcessDTO {
   private String processId;
   private ProcessStatus status;
   private hostname;
}

此外,这还意味着要在ProcessProcessDTO之间进行映射,这可以手动完成,也可以使用诸如org.modelmapper之类的某种库来完成。

假设Process是某种实体类,实际上不建议您直接使用它们直接发送回JSON数据。

答案 1 :(得分:0)

您可以使用JsonView功能。您可以定义几个不同的级别:

public class Views {
    public static class Public {
    }

    public static class Internal extends Public {
    }
}

现在,您需要注释POJO属性:

public class Process{
   @JsonView(Views.Public.class)
   private String processId;

   @JsonView(Views.Public.class)
   private ProcessStatus status;

   @JsonView(Views.Internal.class)
   private String hostname;

   @JsonView(Views.Internal.class)
   private String errorMessage;
}

当您已经有了这个时,您需要注释API方法。 GET

@RequestMapping(value = "/process", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_UTF8_VALUE })
@JsonView(Views.Public.class)
public Process getProcess (@RequestParam("processId") String processId)

对于POST

@RequestMapping(value = "/process", method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE })
@JsonView(Views.Internal.class)
public HttpStatus updateProcess (@RequestBody Process process)

当然,您可以为视图选择更好的名称。以上只是阅读链接文章后的示例用法。我没有测试它,但是您应该有一个大概的想法。