序列化器仅来自指定控制器的方法-Spring,JSON Jackson [英] Serializer a method just from a specify Controller - Spring, JSON Jackson

查看:104
本文介绍了序列化器仅来自指定控制器的方法-Spring,JSON Jackson的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2个控制器和一个自定义序列化字段(如@JsonSerialize(using = MySerialization.class))的get方法.

I have 2 controllers and a get method for a field with custom serialization like as @JsonSerialize(using = MySerialization.class).

但是我只想在从A Controller而不是从B Controller调用方法时进行此序列化.

But I want to make this serialization just when I call method from A Controller, not from B Controller.

我该如何指定呢?

推荐答案

好的,我假设您具有以下请求映射

Okay, I will assume that you have the follow requestmaps

@RequestMapping(value = "/saveA", method = RequestMethod.GET)
public @ResponseBody Person getPersonA() {
    return getPerson();
}

@RequestMapping(value = "/saveB", method = RequestMethod.GET)
public @ResponseBody Person getPersonB() {
    return getPerson();
}

private Person getPerson() {
    return new Person("Elvis");
}

static class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

所以您想在每个requestMap上以不同的方式序列化 Person 对象,我个人找不到(甚至看不到)Spring解决方案,我认为这是一个Jackson和Java问题得到解决,所以这是我的解决方案:

So you want to serialize the Person object in different ways at each requestMap, I personally could not found (even see) a Spring Solution for that, I think that is a Jackson and Java problem to be solved, so here is my solution:

创建一个 Person 子类,然后根据需要对其进行自定义,例如

Create a Person subclass then customize it as you need, for example

static class CustomPerson extends Person {

    public CustomPerson(String name) {
        super(name);
    }

    @JsonSerialize(using = NameSerializer.class)
    @Override
    public String getName() {
        return super.getName();
    }
}

static class NameSerializer extends JsonSerializer {

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString("customSerializer-" + String.valueOf(value));
    }
}

然后,您要做的就是创建一个映射器方法,该方法将您的 Person 转换为 CustomPerson

Then, all you need to do is create a mapper method, that converts your Person to a CustomPerson

@RequestMapping(value = "/saveB", method = RequestMethod.GET)
public @ResponseBody Person getPersonB() {
    return getCustomPerson();
}

private Person getCustomPerson() {
    return new CustomPerson(getPerson().getName());
}

另一种选择是您自己创建对象映射器,并在需要定制对象时序列化所需的对象

Te another option is to youself create the object mapper and serialize the Object as you want when you need it customized

@RequestMapping(value = "/saveC", method = RequestMethod.GET)
public void getPersonC(HttpServletResponse response) throws IOException {
    response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
    new ObjectMapper()
    .registerModule(new SimpleModule().addSerializer(Person.class, new JsonSerializer<Person>() {
        @Override
        public void serialize(Person value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStartObject();
            gen.writeStringField("name", "Custom-" + value.getName());
            gen.writeEndObject();
        }
    }))
    .writeValue(response.getWriter(), getPerson());
}

这篇关于序列化器仅来自指定控制器的方法-Spring,JSON Jackson的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆