FAQ Colaborativo de AISS
FAQ Colaborativo de AISS
FAQ Colaborativo de AISS
Índice
Índice
P02.2 - “Habilitar librería JDK por defecto para todos los proyectos que se
creen”
P04 - “La consola dice algo sobre dependencias que no se descargan bien”.
P09 - “La URL de autorización necesita una sintaxis que es distinta a la que se envía
por defecto”.
P11 - “Al hacer algo de oAuth me salta un mensaje de session not enabled”.
P13 - “Al intentar hacer una consulta de un recurso, el servidor entiende la petición
pero no las instrucciones que contiene”.
P17-”Cabeceras a añadir para hacer un ‘post’ que requiere una api key de
autenticación y el cuerpo a enviar es en formato json”
P19-”Al hacer una llamada a la api en rest client de mozilla me da el error 503
Service Unavailable”
P20 - “Mi mashup puede realizar llamadas a un servicio RESTful desde localhost.
Sin embargo, cuando lo despliego en servidor, las llamadas no devuelven el JSON,
sino un mensaje 1001. ¿Por qué?”
P23 - “Hay veces que el servidor devuelve una respuesta cuyo cuerpo es como un
JSON, pero en la cabecera se indica que es algo diferente (es decir, que no es
application/json). Al hacer ClientResource.get(ClaseJava.class) para obtener el
objeto java, obtengo el error Unable to find a converter for this representation...”.
P24 - “Cuando autentico con OAuth2, no recibo el access token directamente, sino
que recibo un ‘code’ que luego tendré que usar como parámetro de una URL. Tras
hacer POST a esa URL, el servicio nos devuelve finalmente el access token”.
P25 - “Aunque en RESTeasy defino todo lo necesario para que funcione con UTF-8,
los ejemplos precargados en el repository tienen tilde/ñ/nombres de mueble de
Ikea… me salen mal codificados.”
P26 - “Las llamadas a la API de Google Books funcionan en local, pero al tenerlo
desplegado sale un error 403 (forbidden) tras la llamada.”
P29 - “Cuando uso alguna API con OAuth2… me sale un error 500”.
2
P31 - “Deployments using appcfg are no longer supported”.
P33 - “La API que he elegido solo tiene OAuth 1 y no quiero usar ninguna otra API”
P35 - “Al probar mi API con SwaggerHub me salta algún mensaje que pone CORS?”
3
Por defecto, en muchos ordenadores, Eclipse apunta al JRE de Java, por lo que no
podrá compilar adecuadamente desde los launch profiles. Es necesario cambiar al
JDK para poder realizar esta compilación de forma correcta.
Se describen dos soluciones, la primera para hacer que el proyecto actual apunte a
la librería JDK de Java, y la segunda para que todos los proyectos que se hagan en
adelante apunten a dicha librería.
En Window->Preferences:
4
Cambiamos el JRE por el JDK pulsando Edit:
En JRE home ponemos la localización del JDK instalado (si no ha sido instalado, hay
que descargarlo desde esta URL2:
P02.2 - “Habilitar librería JDK por defecto para todos los proyectos que se creen”
Para no tener que aplicar la solución de la pregunta P02 en cada proyecto Eclipse
que hagamos, podemos hacer que nuestro Eclipse apunte a la librería JDK en todos
los proyectos nuevos que hagamos.
Para ello, hay que modificar el fichero eclipse.ini. El contenido del fichero eclipse.ini
del Eclipse JEE IDE 2018-12 versión Windows 64 bits es:
-startup
plugins/org.eclipse.equinox.launcher_1.5.200.v20180922-1751.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.900.v20180922-17
51
-product
org.eclipse.epp.package.jee.product
-showsplash
org.eclipse.epp.package.common
--launcher.defaultAction
openFile
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.8
[email protected]/eclipse-workspace
-XX:+UseG1GC
-XX:+UseStringDeduplication
2
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
5
--add-modules=ALL-SYSTEM
-Dosgi.requiredJavaVersion=1.8
-Dosgi.dataAreaRequiresExplicitInit=true
-Xms256m
-Xmx1024m
--add-modules=ALL-SYSTEM
-startup
plugins/org.eclipse.equinox.launcher_1.5.200.v20180922-1751.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.900.v20180922-17
51
-product
org.eclipse.epp.package.jee.product
-showsplash
org.eclipse.epp.package.common
--launcher.defaultAction
openFile
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vm
C:/Program Files/Java/jdk1.8.0_131/bin/javaw.exe (la ruta donde se
6
encuentre la librería Java JDK )
-vmargs
-Dosgi.requiredJavaVersion=1.8
[email protected]/eclipse-workspace
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-Dosgi.requiredJavaVersion=1.8
-Dosgi.dataAreaRequiresExplicitInit=true
-Xms256m
-Xmx1024m
--add-modules=ALL-SYSTEM
Si el error sigue apareciendo tras ejecutar el último launch profile será necesario
parar el proceso Java y Javaw desde el administrador de tareas en Windows o
desde una terminal en otros sistemas.
A veces, aparece un mensaje del estilo: “invalid LOC header (bad signature)”.
7
Si continúa ocurriendo, una solución (aunque algo drástica) es eliminar todo el
repositorio local de Maven para así forzar la descarga de todas las dependencias de
nuevo.
@SuppressWarnings("unchecked")
public void addHeader(ClientResource cr, String headerName, String headerValue) {
Series<Header> headers = (Series<Header>) cr.getRequest().getAttributes()
.get(HeaderConstants.ATTRIBUTE_HEADERS);
if (headers == null) {
headers = new Series<Header>(Header.class);
cr.getRequest().getAttributes().put(HeaderConstants.ATTRIBUTE_HEADERS,
headers);
}
headers.add(headerName, headerValue);
}
//Ejemplo:
addHeader(cr, "Ocp-Apim-Subscription-Key", BING_API_KEY);
8
// encode data using BASE64
String encoded = DatatypeConverter.printBase64Binary(str.getBytes());
System.out.println("encoded value is \t" + encoded);
// Decode data
String decoded = new String(DatatypeConverter.parseBase64Binary(encoded));
System.out.println("decoded value is \t" + decoded);
[ERROR]
-----------------------------------------------------
[ERROR] realm =
plugin>com.google.appengine:appengine-maven-plugin:1.9.46
[ERROR] strategy =
org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
[ERROR] urls[0] =
file:/C:/Users/.m2/repository/com/google/appengine/appengin
e-maven-plugin/1.9.46/appengine-maven-plugin-1.9.46.jar
[ERROR] urls[1] =
file:/C:/Users/TU_USUARIO/.m2/repository/commons-io/commons
-io/1.3.2/commons-io-1.3.2.jar
10
SOLUCIÓN: El error radica de una instalación incompleta o errónea. Basta con
borrar la carpeta “C:\Users\Nombre_Usuario\.m2” y volver a ejecutar el fichero
“StartDevServer.launch”; de esta manera, eclipse vuelve a descargar los recursos
necesarios para ejecutar el fichero con m2.
Nótese que el contenido empieza por “[“. Por lo tanto a la hora de implementar el
método consulta debemos obtener un array de objetos, en lugar de un sólo objeto:
11
haríamos:
En el caso que el servicio RESTful devuelva una lista de objetos JSON, tenemos que
hacer:
Otro problema que puede ocurrir es que el JSON no esté bien formado y no se
pueda leer. Para comprobar que es válido, se puede usar la herramienta
https://jsoneditoronline.org/
12
P17-”Cabeceras a añadir para hacer un ‘post’ que requiere una
api key de autenticación y el cuerpo a enviar es en formato
json”
Añadir las siguientes líneas de código al final del método en el cual invocamos al
método POST:
cr.post(comentario, MediaType.APPLICATION_ALL_JSON);
//MediaType.APPLICATION_ALL_JSON establece Json como
formato del cuerpo del método post
13
P20 - “Mi mashup puede realizar llamadas a un servicio RESTful
desde localhost. Sin embargo, cuando lo despliego en servidor,
las llamadas no devuelven el JSON, sino un mensaje 1001. ¿Por
qué?”
El problema, en general con este tipo de errores, es que el modo de hacer
peticiones con el servidor integrado en el modo de despliegue local es distinto a
cuando se usa la infraestructura de AppEngine.
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<url-stream-handler>urlfetch</url-stream-handler>
</appengine-web-app>
GitHub por defecto devuelve una respuesta de tipo texto (Content-Type: text/html),
lo que provoca que la librería Google-oauth2 lance una excepción.
Para solucionar este error, hemos añadido la cabecera Accept: application/json que
pide al servidor que nos devuelva una respuesta JSON
14
P22 - “Problema autenticación Oauth2 GitHub”.
Respuesta por el grupo PlaceHolder (Grupo 4):
GitHub por defecto devuelve una respuesta tipo texto (Content-Type: text/html), lo
que provoca que la librería Google-oauth2 lance una excepción.
Para solucionar este error, se ha de añadir la cabecera Accept: application/json que
pide al servidor que nos devuelva una respuesta JSON.
Para ello hay que modificar el archivo TokenRequest.java situado en el paquete
aiss.controller.oauth. En específico la línea 269:
headers.setAccept("application/json");
request.setHeaders(headers);
requestFactory.buildPostRequest(tokenServerUrl, new
UrlEncodedContent(this);
request.setHeaders(headers);
15
P23 - “Hay veces que el servidor devuelve una respuesta cuyo
cuerpo es como un JSON, pero en la cabecera se indica que es
algo diferente (es decir, que no es application/json). Al hacer
ClientResource.get(ClaseJava.class) para obtener el objeto java,
obtengo el error Unable to find a converter for this
representation...”.
Hay servicios que a veces, al realizar la consulta, no devuelven application/json en
su cabecera, si no que devuelven otro formato como podría ser geojson para
mapas, o cualquier otro. En este caso puede que el test y nuestra aplicación nos
aporte un error “Unable to find a converter…”, que se puede solventar de varias
formas, pero aporto dos.
import org.codehaus.*;
import org.restlet.*;
return search;
16
// Forma 2 //
con.setRequestProperty(HttpHeaders.ACCEPT, "application/vnd.problem+json;
charset=utf-8"); //problem sería el MediaType que os aporta el error
con.setRequestMethod(HttpMethods.GET);
String inputLine;
content.append(inputLine);
in.close();
return search;
17
jsonschema2pojo hace ésto automáticamente, pero al usar estos métodos
necesitamos dejarlo tal cual venía originalmente, cambiandolo manualmente.
Explicaremos la situación paso a paso ya que puede que otras APIs presenten la
misma problemática. Para entender mejor el problema lo mejor es entender cómo
autenticarse en la API de Unsplash:
18
A nivel de código lo sacaremos con el proporcionado por los laboratorios de la
asignatura:
Ahora llegamos a la parte que generó una problemática a nuestro grupo: cómo
sacar un parámetro de un POST a una URL.
Bien, desde la API de Unsplash nos indican cómo formar la URL y nos dan el
recurso JSON devuelto por lo que cogemos el recurso y lo pasamos a clase Java con
www.jsonschema2pojo.org, para después poder elegir el parámetro que queremos
obtener del POST, en nuestro caso usaremos getAccessToken().
19
Primero, creamos el String con el contenido de la URL y la variable result donde
devolveremos el access token. Creamos un ClientResource con la URL que hemos
creado y dentro de result hacemos POST al ClientResource sacando el access token
de lo que nos ha devuelto la función con getAccessToken().
AccessToken.class representa la clase que hemos creado a partir del JSON que nos
proporciona la API.
20
P27 - “Al darle a StartDevServer sale un mensaje de An illegal
reflective access operation has occurred”
Esto ocurre porque estamos usando la versión >1.8 del JDK de Java. Debemos
instalar la 1.8 para solucionar este problema
(https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-
2133151.html)
En este caso, estamos accediendo a la aplicación a través del protocolo “http” (al
lado de la URL aparece “No es seguro”). Sin embargo, al incluir la documentación
de Swagger en el proyecto, pusimos la URL con “https” en el fichero
/docs/index.html, tal que así:
21
Para resolver el error, basta acceder a la aplicación a través del protocolo “https”.
El motivo es que OAuth2 define en sun RFC unos formatos concretos de mensajes
en JSON. Por ejemplo, el scope debe ser un string con los valores separados por
comas y no un array. Estas pequeñas sutilezas hacen que algunas APIs lo
implementen de forma ligeramente diferente y, por desgracia, al usar una
herramienta genérica, nos falle.
22
Por ejemplo, para el caso de Twitch:
Problema: expiresIn lo dan como Integer (debería ser un Long) y scope como
List<String> (debería ser un String del tipo “algo,algo,algo,algo”)
Es una solución que puede constar trabajo pillarla al principio, pero que resulta
más sencilla que implementar tu propia petición POST manualmente.
Si tienes dudas, recuerda que tu profesor/a de prácticas estará ahí para ayudarte :)
---
23
Hemos publicado un nuevo vídeo para ayudar en los pasos necesarios para realizar
la migración: https://www.youtube.com/watch?v=bGc9tlU1kRo
<dependency>
<groupId>com.squareup.okhttp</groupId>
<artifactId>okhttp</artifactId>
<version>2.5.0</version>
</dependency>
Si a la hora de mostrarlo en nuestro mashup diera algún error del tipo “not marked
as ignorable” bastaría con seguir lo que pone en las diapositivas de la práctica 5
24
para cada clase java en la que hiciera falta.
P33 - “La API que he elegido solo tiene OAuth 1 y no quiero usar
ninguna otra API”
Todo el código que se ofrece en la asignatura está preparado para OAuth2. La
versión 1 de este protocolo incorpora más complejidad (ej. hay que firmar la
petición con un protocolo HMAC) del lado del cliente y prácticamente está en
desuso hoy en día.
No obstante, si estás muy interesado en seguir usando OAuth1, puedes usar esta
biblioteca externa: https://github.com/scribejava/scribejava
25
3) probar de nuevo
https://www.codepedia.org/ama/how-to-enable-cors-filter-in-resteasy
Es totalmente normal. Si usas una versión antigua y ‘no oficial’ siempre habrá
errores y problemas...
Para este problema basta con coger la última versión de Swagger-UI aquí:
https://github.com/swagger-api/swagger-ui/releases
26