Pergunta

Tenho o seguinte JSON, onde pode ser verdadeiro ou falso:

{"flag1":<boolean value>, "flag2":<boolean value>}

E tentei vinculá-lo a uma classe Java usando Jersey e as seguintes anotações JAXB:

@XmlRootElement
public class MyClass {
    @XmlElement(name = "flag1", type = Boolean.class)
    private Boolean flag1;
    @XmlElement(name = "flag2", type = Boolean.class)
    private Boolean flag2;

    ...
}

O problema é que quando atribuo um valor não booleano a 'flag1' ou 'flag2', como no exemplo abaixo, o JAXB atribui automaticamente um valor falso aos campos 'flag1' e 'flag2' de MyClass.

{"flag1":"foo", "flag2":"bar"}

Existe uma maneira de anotar 'MyClass' para que, quando 'flag1' e 'flag2' do JSON não sejam booleanos, eu receba uma exceção?

Foi útil?

Solução

Parece que Jersey está simplesmente usando Boolean.valueOf, que trata tudo que não seja um "verdadeiro" literal como falso.Como o JavaScript não tem noção de tipo de variável, esse é um comportamento indiscutivelmente válido.

Um mapeamento XML, em comparação, é baseado em uma definição de esquema, que possui uma noção muito específica de valores booleanos.


Não tendo usado Jersey (ou JAXB desde os dias 1.x), estou me perguntando se você precisa anotar as variáveis ​​reais ou se pode anotar os setters.Ou talvez você possa fornecer um levantador que leve um String e analisa-o, em vez de / junto com um setter que leva um boolean.

Outras dicas

O que você mostrou funcionaria da maneira que você deseja (faça uma exceção) se você usasse o provedor Pure Jackson Jax-RS. Ele aceita algumas variações (1 e 0, uma vez que alguns idiomas não têm tipo booleano nativo), mas não coisas que não têm equivalente significativo.

Alternativamente, como sugerido, um método de setter com string de tipo faria sentido, pois você poderia controlar manualmente as conversões.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top