我是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时,它将同时忽略这两个请求。
答案 0 :(得分:0)
最简单的方法是使用另一个DTO(数据传输对象)类,该类不包含您不希望发送回的字段。在您的情况下,这意味着要创建一个ProcesDTO
类,如下所示:
public class ProcessDTO {
private String processId;
private ProcessStatus status;
private hostname;
}
此外,这还意味着要在Process
和ProcessDTO
之间进行映射,这可以手动完成,也可以使用诸如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)
当然,您可以为视图选择更好的名称。以上只是阅读链接文章后的示例用法。我没有测试它,但是您应该有一个大概的想法。