Я вижу проблему с некоторыми полями, которые были снабженнымиДжексон производства пустой XML с dropwizard, но не в единичном испытании
@JsonSerialize
Когда окружающий класс возвращается из веб-службы, как XML, но не в модульном тесте. Когда услуга вызывается с заголовком Accept «application/json», все работает нормально. Когда служба вызывается с заголовком Accept «application/xml», поля с указанным сериализатором будут пропущены с помощью пустого тега XML.
Пример кода (упрощенный из реальной проблемы).
public abstract class AbstractEntity {
private String name;
@JsonSerialize(using = MyStampSerializer.class)
private MyStamp created;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public MyStamp getCreated() {
return this.created;
}
public void setCreated(MyStamp created) {
this.created = created;
}
}
@Immutable
@JsonIgnoreProperties(ignoreUnknown = true)
@XmlRootElement(name = "entity")
public class Entity extends AbstractEntity {
public Entity() {
super();
}
}
public class MyStampSerializer extends JsonSerializer<RegistryStamp>
{
@Override
public void serialize(MyStamp stamp, JsonGenerator jgen, SerializerProvider provider)
throws IOException
{
jgen.writeStartObject();
jgen.writeStringField("name", stamp.getName());
jgen.writeNumberField("timestamp", stamp.getTimestamp().getMillis());
jgen.writeEndObject();
}
}
public class EntityXMLTest {
@Test
public void serializeAndDeserializeTest() throws InvalidClassificationException, JsonProcessingException, IOException, InvalidNameException {
Entity entity = buildTestEntity(); // Code not included.
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.registerModule(new RegistryModule());
String xml = xmlMapper.writeValueAsString(collection);
assertNotNull(xml);
assertThat(xml, is("Hello"));
}
}
Таким образом, в том случае, если XML запрашивается веб-служба, (неверный) выход выглядит следующим образом:
<entity>
<name>theName</name>
<created />
</entity>
Но в тесте единицы, то (правильный) выход выглядит следующим образом:
<entity>
<name>theName</name>
<created>
<name>otherName</name>
<timestamp>8647567</timestamp>
</created>
</entity>
JSON как ожидалось как в модульных тестах, так и в веб-сервисе.
Если я закомментируйте сериалайзер и повторно запустить тест блока, выход выглядит следующим образом:
<entity>
<created>
<name>test1</name>
<timestamp>
<dayOfYear>2</dayOfYear>
<dayOfMonth>2</dayOfMonth>
<dayOfWeek>5</dayOfWeek>
<era>1</era>
<year>1970</year>
<weekOfWeekyear>1</weekOfWeekyear>
<!-- snip ..... etc -->
</timestamp>
</created>
</entity>
Таким образом, мы явно нуждаются в сериалайзере применять для XML, а который происходит, когда я звоню XMLMapper непосредственно в модульном тесте.
Есть ли способ сказать Jersery/Jackson использовать сериализатор для XML и JSON? Есть ли способ узнать, почему Джексон завершает XML для полей с помощью пользовательских сериализаторов? Кроме того, есть ли способ настроить модульный тест так, чтобы он вел себя так же, как веб-сервис dropwizard/Jersey/Jackson?
Итак, правильно ли я понимаю: вы хотите, чтобы сериализация xml также отображала созданное время? – pandaadb
@pandaadb Да. Я изменил вопрос, чтобы сделать это немного яснее. –
Извините, я еще не писал письмо:/Ваша проблема может быть связана с тем, как DW инициализирует свой объект mapper. Вы можете начать с того, что попытаетесь найти автора тела сообщения для типа содержимого xml и выполните его. я надеюсь, что я доберусь, чтобы проверить, что происходит там скоро, а затем ответьте :) – pandaadb