2013-09-09 2 views
0

У меня проблема с некоторыми службами RESTful, которые принимают объект передачи в параметре (в основном объект XML, который будет немаршрутизирован POJO).Как JAXB/Джерси unmarshall имеет значение Boolean?

@XmlRootElement(name = "myPojo") 
public class MyPojo { 
    @XmlElement(name = "myField") 
    private Boolean myBoolean; 

    public void setMyBoolean(Boolean bool) { 
     myBoolean = bool; 
    } 

    public Boolean getMyBoolean() { 
     return myBoolean; 
    } 
} 

И обслуживание что-то вроде этого:

public class MyRestService { 

    @PUT 
    @Path("somewhere") 
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
    public Response update(MyPojo pojo) { 
     System.out.println("Boolean value: " + pojo.getMyBoolean(); 
    } 
} 

Если я отправляю этот фрагмент XML:

<myPojo> 
    <myField>false</myField> 
</myPojo> 

я получил:

Boolean value: false 

И если я отправляю этот фрагмент XML:

<myPojo> 
    <myField>FALSE</myField> 
</myPojo> 

я получил:

Boolean value: null 

Я бегу, что код под Glassfish 4 с Джерси 1.9.1 и JAXB 2.2.7. Кроме того, в Glassfish 2 у меня появилось другое поведение, в котором как прописные, так и строчные буквы не отображаются, как ожидалось.

Итак, мне очень любопытно узнать, что происходит, и почему сортировка булевых отличается.

Заранее спасибо

+0

Попытка использовать примитивный тип, а не типа обертки. Я предполагаю, что значение будет иметь значение [Boolean.valueOf (String)] (http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html#valueOf (java. lang.String)) дает. –

ответ

1

После нескольких исследований, мы выяснили, что версия 2.2 JAXB мы используем, кажется, содержат ошибку, сериализовать булевы значения не как ожидалось. Я имею в виду, например: FaLsE будет преобразован в нулевое значение.

Обновление до версии 2.2.7 устраняет проблему.

+0

Интересно. Мы также используем 2.2 и наблюдаем случай, когда входящий XML-запрос со значением «True» для логического поля делает его «null» после привязки JAXB. – asgs

2

Сегодня я столкнулся с той же проблемой, когда JAXB возвращает null при разборе «FaLsE» или «True» в булевом поле. К сожалению, обновление до 2.2.7 или выше (2.2.11 на сегодняшний день) мне не помогло. Когда я копаю глубже в исходный код, кажется, что логика синтаксического анализа происходит внутри DatatypeConverterImpl.java. И нет конфигурации, которая может изменить ее поведение в верхнем регистре.

Link to JAXB DatatypeConverterImpl.java

Решение, которое я нашел (и работает), чтобы определить новый BooleanAdapter и просит JAXB использовать это вместо этого. В адаптере вы можете определить любую логику преобразования, которая подходит для вашего приложения.

Пользовательские BooleanAdapter.java

public class BooleanAdapter extends XmlAdapter<String, Boolean> { 

    @Override 
    public Boolean unmarshal(String v) throws Exception { 
     if (StringUtils.isBlank(v)) 
      return null; 
     return Boolean.valueOf(v); 
    } 

    @Override 
    public String marshal(Boolean v) throws Exception { 
     if (v == null) 
      return null; 
     return v.toString(); 
    } 
} 

Ваша модель объекта

@XmlElement(name = "myField") 
@XmlJavaTypeAdapter(BooleanAdapter.class) 
public Boolean getMyBoolean() { 
    return myBoolean; 
}