有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我不熟悉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时,它会忽略这两个请求


共 (2) 个答案

  1. # 1 楼答案

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

    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. # 2 楼答案

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

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

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

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