2017-02-07 4 views
0

Я вижу проблему с некоторыми полями, которые были снабженнымиДжексон производства пустой 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?

+0

Итак, правильно ли я понимаю: вы хотите, чтобы сериализация xml также отображала созданное время? – pandaadb

+0

@pandaadb Да. Я изменил вопрос, чтобы сделать это немного яснее. –

+0

Извините, я еще не писал письмо:/Ваша проблема может быть связана с тем, как DW инициализирует свой объект mapper. Вы можете начать с того, что попытаетесь найти автора тела сообщения для типа содержимого xml и выполните его. я надеюсь, что я доберусь, чтобы проверить, что происходит там скоро, а затем ответьте :) – pandaadb

ответ

0

В конце концов я получил его работу. Ключевые моменты:

Если вы хотите использовать @JsonSerialize с Джексоном и dropwizard, вы, вероятно, необходимо использовать dropwizard-xml расширение пучка, описанное в самом низу jackson annotations page

После этого ряд изменений были требуется, чтобы получить XML смотреть прямо, в основном с участием

@JacksonXmlProperty and 
@JacksonXmlElementWrapper 

Последняя проблема была найти версию dropwizard-XML, который был совместим с версиями Джексону, что я использовал, и скомпилированных с Java 1.7 I найдено 0.9.0-30 полезно.

Смежные вопросы