Ответы JSON из Джерси 1.x (1.17) с JAXB не могут быть десериализованы Джексоном

У меня есть трикотажный веб-сервис, работающий под управлением версии 1.17, и он поддерживает возврат ответов как через XML, так и через JSON через аннотацию @Produces. Я предполагаю, что он использует JAXB по умолчанию при возврате ответов JSON, но у меня нет возможности это подтвердить. На данный момент мои существующие клиенты также используют тот же сериализатор/десериализатор JAXB. Я хочу создать новый клиент, который использует Jackson, не затрагивая существующие клиенты.

Ответ JAXB JSON несовместим с Jackson for Maps. JSON для карты с использованием JAXB имеет вид

"mapName":{"entry":[{"key":"key1","value":"value1"},{"key":"key2","value":"value2"}]}

и Джексон не может разобрать это. Есть ли способ заставить Джексона проанализировать этот JSON?

Еще одна попытка: сменить Джерси на Джексона

Это не предпочтительный вариант, но я попытался установить для параметра «com.sun.jersey.api.json.POJOMappingFeature» значение true, чтобы разрешить ему использовать Jackson для сериализации/десериализации JSON, однако служба в конечном итоге возвращает 500 секунд в ответ без регистрации каких-либо исключений. . уровень регистратора log4j установлен на TRACE. Я включил ContainerRepsonseFilter для подтверждения 500-х в ответе, и, к моему удивлению, он регистрирует успешный ответ 2xx. Я предполагаю, что проблема возникает где-то дальше по стеку, но я не знаю, где.


person atomic_ice    schedule 09.05.2014    source источник


Ответы (1)


В итоге я использовал MOXy, который может анализировать вышеуказанный формат json.

@Provider

открытый класс JsonMoxyConfigurationContextResolver реализует ContextResolver {

private final MoxyJsonConfig config;

public JsonMoxyConfigurationContextResolver() {
    final Map<String, String> namespacePrefixMapper = new HashMap<String, String>();
    namespacePrefixMapper.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");

    config = new MoxyJsonConfig()
        .setNamespacePrefixMapper(namespacePrefixMapper)
        .setNamespaceSeparator(':');
}

@Override
public MoxyJsonConfig getContext(Class<?> objectType) {
    return config;
}

}

и включил его клиент Джерси 2.x, используя

cc.register(JsonMoxyConfigurationContextResolver.class);
person atomic_ice    schedule 15.05.2014