Пользовательский сериализатор Spring MVC для аннотированных методов - PullRequest
0 голосов
/ 29 ноября 2018

Я уже давно борюсь с этим.Я использую Spring MVC 3.1 с Jackson MessageConverter для сериализации JSON и хочу настроить дополнительный сериализатор.У меня есть класс ApiCustomer

public class ApiCustomer {

//customer
private String id;
private int customerNr;
private String customerNrExternal;
private String status;


@Override
@Column(table=PREFIX_CUSTOMER, name="id")
public String getId() { return id; }

@Override
public void setId(String id) { this.id = id; }

@Column(table=PREFIX_CUSTOMER, name="customerNr")
public int getCustomerNr() { return customerNr; }

public void setCustomerNr(int customerNr) { this.customerNr = customerNr;        }

@Column(table=PREFIX_CUSTOMER, name="customerNrExtern")
public String getCustomerNrExternal() { return customerNrExternal; }

public void setCustomerNrExternal(String customerNrExternal) { this.customerNrExternal = customerNrExternal; }

@Translate
@Column(table=PREFIX_PREDEFINED_PROPERTY, name="value")
public String getStatus() { return status; }

public void setStatus(String status) { this.status = status; }
}

, который я хотел бы сериализовать как JSON.Для определенных полей (в этом примере status) я бы хотел, чтобы Spring использовал пользовательский сериализатор TranslateSerializer:

public class TranslateSerializer extends StdSerializer<String> {

public TranslateSerializer() {
    super(String.class);
}

public TranslateSerializer(Class<String> t) {
    super(t);
}

@Override
public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
    jgen.writeStartObject();
    jgen.writeStringField("key", value);
    jgen.writeStringField("translated", Strings.instance().get(value));
    jgen.writeEndObject();
}
}

Первый вопрос : можно ли использовать толькособственную аннотацию, например @translate в ApiCustomer и настройку пружины, чтобы использование @JsonSerialize(using = TranslateSerializer.class) было ненужным?

Второй вопрос : Как я могу зарегистрировать дополнительный сериализатор, который затемиспользуется только для аннотированных методов?Моя текущая конфигурация выглядит следующим образом:

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                    <property name="featuresToDisable">
                        <array>
                            <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS" />
                        </array>
                    </property>
                    <property name="serializers">
                        <array>
                            <bean class="TranslateSerializer"/>
                        </array>
                    </property>
                </bean>
            </property>
        </bean>
        <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
            <property name="marshaller" ref="xstreamMarshaller" />
            <property name="unmarshaller" ref="xstreamMarshaller" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
...