lunes, 22 de abril de 2013

Ejemplo de uso de librería Jackson de Spiring para consumir JSON por servicio REST


Un breve ejemplo de cómo utilizar la librería Jackson de Spring para consumir un JSON que retorna un servicio REST. La clase de abajo es un Singleton que inicializa el RestTemplate una sola vez.

import java.util.ArrayList;
import java.util.List;
import org.springframework.http.MediaType;
import org.springframework.http.client.CommonsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

public class RestJsonTest {
 
 private static RestJsonTest instance;
 private RestTemplate restTemplate;
 private String url ="http://rest.service.url";
 
 public static RestJsonTest getInstance() {
  if (instance == null) {
   instance = new RestJsonTest();
  }
  return instance;
 }
 
 private RestJsonTest() {
  // Setup the RestTemplate configuration.
  restTemplate = new RestTemplate();
  restTemplate.setRequestFactory(new CommonsClientHttpRequestFactory());
  List<HttpMessageConverter<?>> messageConverterList = restTemplate.getMessageConverters();
  
  // Set HTTP Message converter using a JSON implementation.
  MappingJacksonHttpMessageConverter jsonMessageConverter = new MappingJacksonHttpMessageConverter();
  
  // Add supported media type returned by BI API.
  List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
  supportedMediaTypes.add(new MediaType("text", "plain"));
  supportedMediaTypes.add(new MediaType("application", "json"));
  jsonMessageConverter.setSupportedMediaTypes(supportedMediaTypes);
  messageConverterList.add(jsonMessageConverter);
  restTemplate.setMessageConverters(messageConverterList);
 }
 
 public SearchResults searchResults() {
  return restTemplate.getForObject(url, SearchResults.class);  
 }
 
 public static void main(String[] args) {
  RestJsonTest jsonTest = RestJsonTest.getInstance();
  SearchResults results = jsonTest.searchResults();
 }
}

El mapeo del JSON a clases Java se puede hacer por medio de anotaciones como se muestra a continuación.ç
package com.bodybuilding.api.commerce.clientservice;

import java.util.List;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;


/**
 *{
 * "search_keywords":"Social Networks",
 *  "total_time":200,
 *  "results":{
 *   "result_01":{
 *    "url":"http://www.facebook.com",
 *    "rank": "1"
 *   },
 *   "result_02":{
 *   "url":"http://www.twitter.com",
 *    "rank": "2"
 *   }
 *  }
 * }
 */
@JsonIgnoreProperties(ignoreUnknown=true)
public class SearchResults {
 
 @JsonProperty("search_keywords")
 private String keywords;
 
 @JsonProperty("total_time")
 private long totalTime;
 
 @JsonProperty("results")
 private List<SearchResult> results;
 
 public String getKeywords() {
  return keywords;
 }
 public void setKeywords(String keywords) {
  this.keywords = keywords;
 }
 public long getTotalTime() {
  return totalTime;
 }
 public void setTotalTime(long totalTime) {
  this.totalTime = totalTime;
 }
 public List<SearchResult> getResults() {
  return results;
 }
 public void setResults(List<SearchResult> results) {
  this.results = results;
 } 
}

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown=true)
public class SearchResult {
 
 @JsonProperty("url")
 private String url;
 
 @JsonProperty("rank")
 private int rank;
 
 public String getUrl() {
  return url;
 }
 public void setUrl(String url) {
  this.url = url;
 }
 public int getRank() {
  return rank;
 }
 public void setRank(int rank) {
  this.rank = rank;
 }
}

También se puede configurar el bean de RestTemplate por medio de una inyección de Spring:
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
     <property name="requestFactory">
      <bean id="clientHttpRequestFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory" />   
     </property>
     <property name="messageConverters">
      <list>
       <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
         <list>
          <bean id="jsonMediaTypeTextPlain" class="org.springframework.http.MediaType">
           <constructor-arg value="text"/>
          <constructor-arg value="plain"/>
          </bean>
          <bean id="jsonMediaTypeApplicationJson" class="org.springframework.http.MediaType">
           <constructor-arg value="application"/>
          <constructor-arg value="json"/>
          </bean>
         </list>
        </property>
       </bean>
      </list>
     </property>  
</bean>

domingo, 24 de marzo de 2013

Instalando GIT en distribuciones Fedora


Estaba tratando de instalar GIT en una máquina virtual que me descargué con sistema operativo Linux basado en Fedora. Cuando corría el comando:

$ yum install git

me daba el siguiente error:

yum No package git available.

Despues de buscar un rato por Internet encontré que hay que descargar el repositiorio EPEL (Extra Packages for Enterprise Linux)

sudo rpm -Uvh http://mirrors.ucr.ac.cr/epel/5/i386/epel-release-5-4.noarch.rpm

La URL de arriba es la de un mirror de la Universidad de Costa Rica puesto que es el mirror más cercano que encontró. Si no hace conexión es cuestión de buscar otro que esté activo.

Listo. Se vuelve a ejecutar el comando YUM y esta vez sí debería funcionar.



jueves, 14 de marzo de 2013

Oracle Drop Schema

La manera en que uno borra una base de datos en Oracle (típico DROP SCHEMA), o al menos la forma que conozco, es borrando el usuario dueño del esquema con la opción de cascada:

sqlplus "/ as sysdba";
SQL> drop user user_name cascasde;

Oracle: Importar/Exportar un dump


Una actividad muy recurrente cuando se manejan bases de datos es la de exportar algún esquema para respaldar la base de datos, y luego importarla para restaurar un esquema a un estado en particular.

En Oracle esto se puede hacer desde la línea de comandos usando "expdp" y "impdp" para exportar un dump e importar un dump.

expdp db_user/db_pass schemas=schema_name dumpfile=file_name.dmp
impdp db_user/db_pass schemas=schema_name dumpfile=file_name.dmp

El comando exporta el dump en el path donde está instalado el Oracle. En mi caso lo tira en este directorio:

/usr/lib/oracle/xe/app/oracle/admin/XE/dpdump/

A la hora de importarlo hay que colocarlo ahí tambien puesto que el comando no permite indicar el path  en el parámetro del archivo.