当前位置: 首页 > 知识库问答 >
问题:

Jackson使用dropwizard生成空XML,但不在单元测试中

淳于玺
2023-03-14

我看到了一些已注释的字段的问题

@JsonSerialize 

当周围的类作为XML从web服务返回时,而不是在单元测试中。当使用“application/json”的Accept头调用服务时,一切正常。当使用“application/xml”的Accept头调用服务时,具有指定序列化程序的字段将被一个空的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"));
    }
}

因此,在从web服务请求xml的情况下,(不正确的)输出如下所示:

<entity>
    <name>theName</name>
    <created />
</entity>

但是在单元测试中,(正确的)输出如下所示:

<entity>
    <name>theName</name>
    <created>
        <name>otherName</name>
        <timestamp>8647567</timestamp>
    </created>
</entity>

JSON在单元测试和web服务中都是预期的。

如果我注释掉序列化程序并重新运行单元测试,则输出如下所示:

<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都使用序列化程序?有没有办法找出jackson为什么用自定义序列化程序为字段存根XML?还有,有没有办法配置单元测试,使其行为与dropwizard/Jersey/Jackson web服务相同?

共有1个答案

年文柏
2023-03-14

最终我让它工作了。重点是:

如果要将@JsonSerialize与jackson和dropwizard一起使用,可能需要使用dropwizard xml扩展包,该包在jackson annotations页面的最底部提到

在此之后,需要进行许多更改才能使XML看起来正确,主要涉及

@JacksonXmlProperty and 
@JacksonXmlElementWrapper

最后一个挑战是找到一个与我使用的jackson版本兼容的dropwizard xml版本,并用java 1.7编译,我发现0.9.0-30很有用。

 类似资料:
  • 我目前正在与CDI Unit合作一个项目,我遇到了一个奇怪的问题。我试图在一个简单的项目中重现它: 我有一个使用CdiRunner运行的测试类(如下所述:http://jglue.org/cdi-unit-user-guide/我的测试类注入了被测试的单元:UUD。这个类扩展了一个超级类“ParentTestClass”,它目前是无用的。 测试课。爪哇: 正如我提到的,父类是空的。 ParentT

  • 问题内容: 有什么工具可以自动生成 Java 代码的单元测试? 更新: 主要用途是为将要重构的遗留代码快速生成单元测试。自动生成后,无需自动使测试与代码保持同步。 在这里提出了几乎相同的问题,但是答案是.NET而不是Java(Pex是公认的答案): 问题答案: CodePro Analytix有一个JUnit测试生成模块,听起来像它可以完成您想要的。请参阅《用户指南》。 [CoView]是价格合理

  • 我实现了一个新类Holder。目标如下: 三个领域。字段1和2是整数,字段3是布尔值 这给我留下的问题是有50个可能的构造函数选项。5 X 5 X 2。这是不明智的或可扩展的(添加第6种类型,我必须编写一个巨大的更改),所以我使用了构建器模式: 这真的很有效。我有5个用于字段1初始化的生成器方法,5个用于字段2初始化的生成器方法,还有一个用于布尔值。设置字段后,调用build()方法,该方法使用格

  • 我们使用iText读取输入PDF,然后添加消息并保存输出。 有没有一种方法可以读取单元测试中生成的PDF文件,然后检查所提供的文本是否存在于正确的x、y坐标上?

  • 问题内容: 我对大多数代码都有单元测试。但是我无法弄清楚如何为main包中的main()中的某些代码生成单元测试覆盖率。 主要功能非常简单。它基本上是一个选择块。它读取标志,然后调用另一个函数/执行某些操作,或仅在屏幕上打印帮助。但是,如果命令行选项设置不正确,它将退出并显示各种错误代码。因此,需要进行子过程测试。 我尝试了子流程测试技术,但修改了代码,以使其包括覆盖率标志: 这是原始代码: ht

  • 为什么在STS中运行单元测试是有效的,而在bash中运行mvn测试会产生错误。Groovy库位于类路径中。我也很好奇mvn测试与spock测试有何不同。mvn测试不能拿起斯波克测试吗? pom.xml