如何在Spring中序列化时忽略对象属性临时

时间:2015-10-14 09:38:21

标签: java json spring rest serialization

我正在使用spring框架来创建一个休息服务器。我有一个控制器类,可以通过id请求一个itempattern对象或获取所有对象。使用spring,我使用@ResponseBody@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE)将对象序列化为JSON。

我的控制器类:

@RestController
@RequestMapping("/rest/itempatterns")
public class ItempatternController {
    /**
     * injected resource service interface,
     * loads objects from database
     */
    private IItempatternResource resource;

    /**
     * GET one itempattern by the three identifier,
     * URL: /rest/itempatterns/:id
     *
     * @param id
     * @return
     */
    @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody Itempattern getTirepatternById(@PathVariable("id") int id) {
        return resource.getById(id);
    }

    /**
     * GET all itempatterns,
     * URL: /rest/itempatterns
     *
     * @return
     */
    @RequestMapping(value = "", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody List<Itempattern> getAllTirepatterns() {
        return resource.getAll();
    }

}

从资源我可以收到一个itempattern对象,看起来像这样:

public class Itempattern implements Serializable {

    private static final long serialVersionUID = -6168853991825655795L;

    @JsonProperty("itemtype")
    private Itemtype itemtype;

    @JsonProperty("pattern")
    private String patternXML;

    public Itempattern() {
        super();
    }

    public Itempattern(Itemtype itemtype, String patternXML) {
        super();
        this.itemtype = itemtype;
        this.patternXML = patternXML;
    }

    //...getter and setter
}

问题是,属性patternXML是一个非常长的字符串,有时我想加载所有属性的所有itempatterns,有时候序列化时应忽略属性patternXML(以节省网络资源) )。例如,我想填写一个选择列表,并且不想加载具有patternXML属性的所有对象(可能稍后在点击时加载它)。

使用@ResponseBody进行序列化时是否有可能忽略属性在某些情况下是暂时的?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可能正在寻找杰克逊的@JsonView功能。有了这个,您可以告诉某个请求映射,以生成具有所选属性集的序列化JSON。

示例

public class View {
    interface Summary {}
}

public class User {

    @JsonView(View.Summary.class)
    private Long id;

    @JsonView(View.Summary.class)
    private String firstname;

    @JsonView(View.Summary.class)
    private String lastname;

    private String email;
    private String address;
    private String postalCode;
    private String city;
    private String country;
}

控制器

@RestController
public class MessageController {

    @Autowired
    private MessageService messageService;

    @JsonView(View.Summary.class)
    @RequestMapping("/messageSummaryOnly")
    public List<Message> getAllMessages() {
        return messageService.getAll();
    }
}

/messageSummaryOnly的请求将生成序列化列表,其中每个Message仅填充的字段是使用@JsonView(View.Summary.class)注释的字段

参考:https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring

答案 1 :(得分:0)

当条件不需要加载patternXML时,在条件下使你的程序中的patternXML值明确地显示为NULL并尝试使用

JSONINCLUDE(INCLUDE.NON_NULL) in your POJO Class 

这样该值将为null,并且不会在大小写中加载值。