2010-04-23 7 views
26

Mam zasobu JAX-RS, który staje się jego paramaters jako łańcuch JSON jak poniżej:Konwersja JSON parametry kwerendy do obiektów z JAX-RS

http://some.test/aresource?query={"paramA":"value1", "paramB":"value2"} 

Powodem wykorzystać JSON tutaj jest to, że zapytania obiekt może być dość skomplikowany w rzeczywistych przypadkach.

Chciałbym przekonwertować ciąg JSON do obiektu Java, dto na przykład:

@GET 
@Produces("text/plain") 
public String getIt(@QueryParam("query") DataTransferObject dto) { 
    ... 
} 

Czy JAX-RS wspierać taką konwersję z JSON przekazany jako param zapytań do obiektów Java?

Odpowiedz

15

Tak, możesz to zrobić, ale musisz samemu wpisać kod konwersji. Na szczęście jest to łatwe, wystarczy napisać klasę, która ma publiczny konstruktor, który wykona konwersję. Na przykład:

public class JSONParam { 
    private DataTransferObject dto; 

    public JSONParam(String json) throws WebApplicationException { 
     try { 
      // convert json string DataTransferObject and set dto 
     } 
     catch (JSONException e) { 
      throw new WebApplicationException(Response.status(Status.BAD_REQUEST) 
        .entity("Couldn't parse JSON string: " + e.getMessage()) 
        .build()); 
     } 
    } 

    public DataTransferObject getDTO() { 
     return dto; 
    } 
} 

Następnie można użyć:

@GET 
@Produces("text/plain") 
public String getIt(@QueryParam("query") JSONParam json) { 
    DataTransferObject dto = json.getDTO(); 
    ... 
} 
+4

Ponieważ wszystko wydaje się, że „JSONParam” nie jest owinąć „DataTransferObject” i używać ciąg konstruktora opartą ... Czy możliwe jest dodanie konstruktora opartego na ciągach do obiektu DataTransferObject? – hypno7oad

8

Dodanie do roztworu Jasona, używając http://www.json.org/java/ (dzięki uprzejmości Crockforda):

import org.json.JSONObject; 

public class JSONParam { 
    private DataTransferObject dto; 

    public JSONParam(String json) throws WebApplicationException { 
     try { 
      // convert json string DataTransferObject and set dto 
      JSONObject jo = new JSONObject(json); 
      dto.setParamA(jo.getString("paramA")); 
      dto.setParamB(jo.getString("paramB")); 
      // There are other get methods for Integer, Double, etc. 
      // You can also build JSON from Java objects. 
     } 
     catch (JSONException e) { 
      throw new WebApplicationException(Response.status(Status.BAD_REQUEST) 
        .entity("Couldn't parse JSON string: " + e.getMessage()) 
        .build()); 
     } 
    } 

    public DataTransferObject getDTO() { 
     return dto; 
    }     
} 

Nie wymyślać koła :-)

+0

Jeśli nie przekazujesz obiektu JSON przez parametr, nie możesz użyć tego rozwiązania. Ale możesz użyć wersji sugerowanej przez lili ([lili] (http://stackoverflow.com/a/6250744/853510)) –

11

Jak wspomniano, należy jawnie przekonwertować z parametru String na JSON. Ale nie ma potrzeby używać czegoś tak prymitywnego jak parser org.json; Jackson lub Gson można wykonać powiązanie danych (String z JSON, JSON do POJO) w linii lub dwóch. Z Jackson:

MyValue value = new ObjectMapper().readValue(json, MyValue.class); 

(dla produkcji kodu, wystarczy utworzyć ObjectMapper raz jako statyczny element, ponownego wykorzystania)

Jackson jest to, co większość JAX-RS implementacje wykorzystać do realizacji dane wiążące dla danych POST, więc jest to całkiem podobny.

0

Jeśli chcesz wygenerować swoje DTO, czy mogę zasugerować jsonschema2pojo? Możesz definiować obiekty za pomocą JSON Schema i automatycznie generować DTO.

Po napisaniu schematu można go również przekazać konsumentom, aby dokładnie zrozumieli sposób formatowania żądań.

4

JAX-RS obsługuje użycie JAXB (Java API for XML Binding) do wiązania JavaBean do XML lub JSON i vice versa. Więcej szczegółów można znaleźć tutaj, na przykład: http://www.ibm.com/developerworks/web/library/wa-aj-tomcat/index.html

Trzeba

  • Dodaj @XmlRootElement adnotacji na DataTransferObject
  • utworzyć pustego konstruktora domyślnego w DataTransferObject
  • Dodaj @Consumes (MediaType.APPLICATION_JSON) adnotacji do WebService
+0

Jeśli potrzebujesz przykładu, zobacz [https://blogs.oracle.com/enterprisetechtips /entry/configuring_json_for_restful_web](https://blogs.oracle.com/enterprisetechtips/entry/configuring_json_for_restful_web) szukaj StatusInfoBean. –

Powiązane problemy