在Jersey客户端上使用自定义JAXB上下文

时间:2015-05-19 12:30:49

标签: java json jaxb jersey jersey-client

我使用Jersey客户端1.8 + JAXB。我想发布一个类似于以下内容的JSON有效负载:

{
    "transactions": [ 
    {
        "amount":
        {
            "currency":"EUR","total":"1"
        }
        ...
    }
    ],
}

我有一个看起来像这样的DTO:

@XmlRootElement
public class PaymentRequestDTO
{
    @XmlElement(name="transactions")
    public List<TransactionDTO> getTransactions()
    {
        return transactions;
    }
}   

当列表中只包含一个事务时,我发布的是:

{
    "transactions": {
        "amount":
        {
            "currency":"EUR","total":"1"
        }
        ...
    }
}

交易不被视为数组...我已经失去了几个小时来研究这个问题,包括。在SO中搜索很多,我已经读过我必须注册我自己的上下文解析器 - &gt; here

所以这是:

@Provider
public class XXXJAXBContextResolver implements ContextResolver<JAXBContext>
{
    private JAXBContext context;

    private Class<?>[] types = { PaymentRequestDTO.class, TransactionDTO.class, AmountDTO.class };

    public XXXJAXBContextResolver() throws Exception
    {
        this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), types);
    }

    @Override
    public JAXBContext getContext(Class<?> objectType)
    {
        for (Class<?> type : types)
        {
            if (type == objectType)
            {
                return context;
            }
        }
        return null;
    }
}

注册本身:

ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(XXXJAXBContextResolver.class);
client = Client.create(cc);

我使用了所谓的自然符号:

  

自然JSON表示法,利用紧密耦合的JAXB RI   集成。

     

示例JSON表达式:

     

{&#34;列&#34;:[{&#34; ID&#34;:&#34;用户ID&#34;&#34;标签&#34;:&#34;用户ID&#34; },{&#34; ID&#34;:&#34;名称&#34;&#34;标签&#34;:&#34;用户   名称&#34;}],&#34;行&#34;:[{&#34;用户ID&#34;:1621,&#34;名称&#34;:&#34; Grotefend&#34;}]} < / p>

Link

结果仍然相同 - 有效载荷中没有数组。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

有关信息:

我已经激活了POJO映射(意味着在下面使用了jackson)并且生成的JSON是我需要的......嗯......

ClientConfig cc = new DefaultClientConfig();
cc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);