2013-05-21 14 views
6

Korzystam z usługi Jersey JAX-RS z aplikacją Jackson (do serializacji/deserializacji), aby zaimplementować zestaw usług REST. Gdy wywołujący wykonuje operację aktualizacji (np. PUT), generalnie przestrzegam konwencji, że puste pola wysłane w żądaniu są ignorowane, gdy cel jest aktualizowany. Aktualizowane są tylko te pola, które zostały ustawione na rzeczywistą wartość.Podczas korzystania z usługi Jersey JAX-RS istnieje sposób na rozróżnienie pól wysłanych jako puste i pól, które w ogóle nie są wysyłane?

Jednak wolałbym, gdybym mógł rozróżnić między polami, które zostały wysłane jako zero w stosunku do pól, które nie zostały wysłane w ogóle, więc wiem, aby wyczyścić pola, które zostały wyraźnie wysłane jako puste.

Mogę wymyślić sposób, aby to osiągnąć, ale zastanawiam się, czy jest coś dostępnego w ramach. Wydaje się, że jest to powszechne wymaganie.

Odpowiedz

2

Jeśli używasz wsparcie JSON POJO (parametr startowy com.sun.jersey.api.json.POJOMappingFeature do true w web.config) następnie prostym rozwiązaniem jest mieć "inteligentną setter" na swojej POJO:

class MyBean { 
    private String foo; 
    private String bar; 
    private boolean fooSet; 

    public String getFoo() { 
     return this.foo; 
    } 

    public void setFoo(String foo) { 
     this.foo = foo; 
     this.fooSet = true; 
    } 

    public String getBar() { 
     return this.bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

    public boolean isFooSet() { 
     return this.fooSet; 
    } 
} 

The Jackson wywoła setter if pole jest obecne (bez względu na wartość) i zignoruje je, jeśli w ogóle nie ma pola.

Dla JAXB Based JSON support Nie wiem, czy kiedykolwiek będzie seter nazywane tak może być konieczne, aby napisać niestandardowy MessageBodyReader/MessageBodyWriter s lub wyspecjalizowaną formę JSONJAXBContext.