¿Cómo puedo consumir un servicio OData4 en Java usando Olingo o SDL OData Framework?

Necesito consumir un servicio OData4 de Java y, según la lista de marcos del sitio web de OData, las dos opciones son Olingo o SDL Odata Framework . Mi problema es que la documentación para ambos proyectos se centra en escribir un servicio que no consuma uno. El sitio de Olingo enlaza con una publicación de blog de 2014 que no es compatible con API con la versión actual y no pude encontrar nada en las páginas de SDL Github.

Si alguien pudiera proporcionarme un simple ejemplo POST / GET con el uso de un modelo de objeto POJO adecuado, sería genial.

Mi comprensión limitada es que OData mueve cualquier información sobre el modelo de objeto real del tiempo de compilación al tiempo de ejecución en el cliente. Me complace ignorar esto y codificar contra un modelo de objeto fijo porque el servicio que estamos utilizando no cambiará.

Respuesta 1

La documentación de la API del lado del cliente parece estar un poco descuidada por Olingo. Pero hay un ejemplo en el repositorio GIT en samples / client.

Básicamente para un GET, haces lo siguiente:

String serviceUrl = "http://localhost:9080/odata-server-sample/cars.svc"
String entitySetName = "Manufacturers";

ODataClient client = ODataClientFactory.getClient();
URI absoluteUri = client.newURIBuilder(serviceUri).appendEntitySetSegment(entitySetName).build();
ODataEntitySetIteratorRequest<ClientEntitySet, ClientEntity> request = 
client.getRetrieveRequestFactory().getEntitySetIteratorRequest(absoluteUri);
// odata4 sample/server limitation not handling metadata=full
request.setAccept("application/json;odata.metadata=minimal");
ODataRetrieveResponse<ClientEntitySetIterator<ClientEntitySet, ClientEntity>> response = request.execute(); 
ClientEntitySetIterator<ClientEntitySet, ClientEntity> iterator = response.getBody();

while (iterator.hasNext()) {
     ClientEntity ce = iterator.next();
     System.out.println("Manufacturer name: " + ce.getProperty("Name").getPrimitiveValue());
}

Eche un vistazo a la muestra en la base de código de Olingo para obtener más detalles sobre cómo recuperar metadatos, procesar todas las propiedades, etc.

Para hacer una POST puede hacer lo siguiente. (Tenga en cuenta que este no es un código probado y el servicio de ejemplo de Car es de solo lectura). Primero, cree los datos como ClientEntity. Lo haces, por ejemplo, con

ClientComplexValue manufacturer = of.newComplexValue("Manufacturer");
manufacturer.add(of.newPrimitiveProperty("Name", of.newPrimitiveValueBuilder().buildString("Ford")));

Luego envía la solicitud POST

ODataEntityCreateRequest<ClientEntity> request = client.getCUDRequestFactory().getEntityCreateRequest(absoluteUri, manufacturer);
ODataEntityCreateResponse<ClientEntity> response = request.execute();

Por lo tanto, esto no es con las clases POJO: el tipo de resultado es ClientEntity, que presenta los datos como mapas de nombre / valor. Ya hay otra pregunta sin respuesta sobre ese tema en particular en Olingo: cree POJO fuertemente tipados para la biblioteca del cliente del servicio OData y sugiero que recurramos allí para dar seguimiento a eso.

Respuesta: 2

Básicamente, quiero tener una interfaz para convertir objetos a / desde su representación de cadenas XML o JSON, algo así como la interfaz pública IStringifier {/ ** Convierte el objeto en su cadena ...

En los lenguajes de programación si uso "\ n", agrega un carácter de nueva línea. ¿Podría alguien explicar cómo se traduce "\ n" a una nueva línea y lo mismo para "\ t"?

Tengo dos consultas sql, que devuelven listas. Mi código: List <String> list = em.createNativeQuery (query1) .getResultList (); list.addAll (em.createNativeQuery (query2) .getResultList ()); Lo que tengo:...

He estado tratando de crear mi propia biblioteca para serializar y deserializar tipos primitivos de una clase a xml y de xml a una instancia de clase usando la reflexión para examinar los patrones de nombres de métodos y ...