【问题标题】:Ignore JSON fields for POST request but should not ignore for GET request忽略 POST 请求的 JSON 字段,但不应忽略 GET 请求
【发布时间】:2019-07-12 09:24:56
【问题描述】:

我是 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);
        } 
    }

所以 post 是由负责更新流程信息的组件 A 执行的。 组件 B 正在完成获取以获取现有进程。 问题:我如何隐藏主机名和错误消息以获得获取而不是帖子。当我做@JsonIgnore 时,它​​会忽略这两个请求。

【问题讨论】:

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


    【解决方案1】:

    您可以使用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)
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      假设Process是某种实体类,反正不建议直接用它们来发回JSON数据。

      【讨论】:

      • 感谢您的回复 :) .. 我仍然希望在不引入其他类的情况下做到这一点...例如为字段提供一些注释并在获取和发布期间分别管理这些字段。
      猜你喜欢
      • 1970-01-01
      • 2020-07-29
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      相关资源
      最近更新 更多