2012-04-27 1 views
2

Я использую Джерси как реализацию JSR 311. Объект я пытаюсь преобразовать JSON выглядит следующим образом:Джерси теряет поле id

@XmlRootElement 
public class deliveryTimes{ 
    private Integer id; 
    private Short type; 
    private Integer orderId; 
    /* ... more fields and autogenerated Getters & Setters ... */ 
} 

результат JSON является:

{"deliveryTimes": 
[{"type":"1","orderId":"30449",/* ... other fields ... */ }, 
/* ... */ 
]} 

На словах: Поле «id» теряется. В моих других объектах id-поля имеют другие имена, такие как orderId, customerId, ... и эти поля не теряются.

Мой pom.xml выглядит следующим образом:

<!-- other stuff --> 
<!-- JERSEY --> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>1.11</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.11</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-grizzly2</artifactId> 
    <version>1.11</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-servlet</artifactId> 
    <version>1.11</version> 
</dependency> 

<!-- Jersey + Spring --> 
<dependency> 
    <groupId>com.sun.jersey.contribs</groupId> 
    <artifactId>jersey-spring</artifactId> 
    <version>1.11</version> 
    <exclusions> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 
<!-- other stuff --> 

Там нет никаких дополнительных настроек. Я не нашел ничего полезного на сайте Джерси или через Google, поэтому я оказался здесь с моим первым сообщением.

Есть ли какой-либо вариант конфигурации, который мне не хватает? Как вы JSONify id-fields?

ответ

2

Существует ряд причин, по которым id может не сортироваться.

1 - имеет нулевое значение

реализациями JAXB по умолчанию не будет МАРШАЛ из нулевых значений. Если вы хотите, чтобы мобилизовывать из нулевое значение не забудьте добавить следующую аннотацию

@XmlElement(nillable=true) 

Для получения дополнительной информации см:

2 - Существует поле, но не нет методов доступа (get/set)

По умолчанию JAXB отображает только общие поля и accesso RS. Все, что не соответствует этим критериям, считается неотображенным.Вы можете решить эту проблему, указав XmlAccessorType(XmlAccessType.FIELD)

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class deliveryTimes{ 
    ... 
} 

или аннотирования поле

@XmlRootElement 
public class deliveryTimes{ 
    @XmlElement 
    private Integer id; 
} 

Для получения дополнительной информации см:

3 - Существует метод get bu t нет установленного метода

Если есть метод get, но не сопутствующий метод установки, то реализация JAXB будет рассматривать его как неотображенное свойство. Чтобы исправить это, вам просто нужно сопоставить метод get с @XmlElement.

+0

Спасибо за ваш ответ. Фактически я искал способ передачи нулевых значений (вы правильно догадались в # 1) и изменил тип данных «id» от int до Integer, но забыл setter. В следующий раз я дам репозитору IDE. Еще раз спасибо за подробный полезный ответ (я бы это сделал, если бы у меня была достаточно репутации)! –

0

В «id» нет ничего особенного. Из @XmlRootElement на вашем классе я предполагаю, что вы используете JAXB для сортировки (по умолчанию с Джерси). В конфигурации по умолчанию JAXB требует, чтобы геттер направлял поле в XML/JSON и сеттер, чтобы размонтировать поле из XML/JSON. В этом случае, я думаю, вам не нужен метод . Вы можете легко изменить это поведение, добавив @XmlElement в поле id.

+1

Или, если не должно быть объекта, можно использовать @XmlAccessorType (XmlAccessType.FIELD) –

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