Используя JAXB (2.2) и Jackson (1.9.13), у меня есть проблема с unmarshalling следующего объекта JSON для моих POJO
{
"userId": "foo",
"group_id": "bar"
}
Обратите внимание, что полезная нагрузка содержит как поле camelCase, так и подчеркивание.
POJO, созданный xjc для моей XML-схемы, выглядит следующим образом:
public class User {
@XmlElement(required = true)
protected String userId;
@XmlElement(name = "group_id", required = true)
protected String groupId;
public String getUserId() { return userId; }
public void setUserId(String value) { this.userId = value; }
public String getGroupId() { return groupId; }
public void setGroupId(String value) { this.groupId = value; }
}
Джексон терпит неудачу со следующим исключением:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "group_id"
То, что я пробовал до сих пор и не удалось
1. Использовать привязку JAXB underscoreBinding="asCharInWord"
Использование следующей привязки JXB в моей XML-схеме
<jxb:globalBindings underscoreBinding="asCharInWord"/>
генерирует следующее POJO:
public class User {
@XmlElement(required = true)
protected String userId;
@XmlElement(name = "group_id", required = true)
protected String groupId;
public String getUserId() { return userId; }
public void setUserId(String value) { this.userId = value; }
public String getGroup_Id() { return groupId; }
public void setGroup_Id(String value) { this.groupId = value; }
}
Обратите внимание, что JAXB теперь генерирует сеттеры/геттеры с подчеркиванием для идентификаторов групп, но поле group_id
все еще преобразуется в CamelCase. Объект Mapper объекта Jackson, похоже, игнорирует имена свойств getter/setter и не может отображать group_id
в groupId
.
2. Стратегия именования собственности Джексона
Использование Jackson PropertyNamingStrategy CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
Я могу преобразовать group_id
в groupId
, но теперь объект mapper не работает на userId
Свойство JSON.
3. Добавьте аннотацию JSONProperty
в группуId
Добавление JSONProperty
в ванильную JAXB сгенерированную POJO фактически работает
public class User {
/* ... */
@XmlElement(name = "group_id", required = true)
@JSONProperty("group_id")
protected String groupId;
/* ... */
}
Однако моя XML-схема огромна, и ручная аппаратура сгенерированных классов не представляется возможной, поскольку мы часто генерируем наши классы.
Что мне делать?
Я вижу следующие две оставшиеся опции для решения этой проблемы:
- Внедрение плагина JAXB, который добавляет аннотацию
JSONProperty
к каждомуXMLElement
с именами подчеркивания (мой предпочтительный следующий подход) - Используйте генератор настраиваемых имен для XJC, как описано в этом. Ответ на Stackoverflow.
Я пропустил очевидное? спасибо за ваши мысли.