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

Java 忽略POST请求的JSON字段,但不应忽略GET请求的JSON字段,java,json,spring,spring-boot,spring-mvc,Java,Json,Spring,Spring Boot,Spring Mvc,我不熟悉Spring引导框架。我有一个模型如下: public class Process{ private String processId; private ProcessStatus status; private hostname; private errorMessage; } 来自控制器的Post呼叫: @RequestMapping(value = "/process", method = RequestMethod.POST,

我不熟悉Spring引导框架。我有一个模型如下:

   public  class Process{
   private String processId;
   private ProcessStatus status;
   private hostname;
   private errorMessage;
}
来自控制器的Post呼叫:

@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);
        } 
    }
因此,post由负责更新流程信息的组件A执行。 组件B正在执行Get以获取现有流程。
问题:如何隐藏get而不是post的主机名和errorMessage。当我不小心执行@JsonIgnore时,它将忽略这两个请求。

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

public class ProcessDTO {
   private String processId;
   private ProcessStatus status;
   private hostname;
}
此外,这意味着要在
进程
进程到
之间进行映射,这可以手动完成,也可以使用某种库来完成,例如

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

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

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
方法进行注释<代码>获取:

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

@RequestMapping(value = "/process", method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_UTF8_VALUE })
@JsonView(Views.Internal.class)
public HttpStatus updateProcess (@RequestBody Process process)
当然,您可以为视图选择更好的名称。以上只是阅读链接文章后的一个示例用法。我没有对它进行测试,但您应该了解大致情况。

谢谢您的回复:)。。我仍然希望在不介绍其他课程的情况下完成它。。。比如为字段提供一些注释,并在get和post期间分别管理这些字段。