Я уже давно борюсь с этим.Я использую 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>