Rayan958
Messages postés32Date d'inscriptionjeudi 31 décembre 2015StatutMembreDernière intervention 8 janvier 2016
-
Modifié par Rayan958 le 1/01/2016 à 12:34
KX
Messages postés16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 2024
-
8 janv. 2016 à 19:06
Bonjour tous le monde,
J'accède à une ressource (http://localhost:8080/CountryCode/v1/e212/33) seulement dans mon logger j'ai un return null alors que je retourne bien quelque chose.
Je vous mets l'intégralité du code, je sais que ça va être long mais j'en suis désolé, je ne vois vraiment pas le problème...
CountriesUtil.java
public class CountriesUtil { private static final Logger logger = Logger.getLogger(CountriesUtil.class); private static final JSONArray ja = new JSONArray(); private static final Hashtable<String, String> name = new Hashtable<String, String>(); private static final Hashtable<String, String> alpha2 = new Hashtable<String, String>(); private static final Hashtable<String, String> alpha3 = new Hashtable<String, String>(); private static final Hashtable<String, String> e212 = new Hashtable<String, String>(); private static final Hashtable<String, String> latlon = new Hashtable<String, String>(); private static int size = 5; private static int nbCountries;
public static String getE212(String Number) { for (int i = size; i > 0; i--) { if (Number.length() >= i - 1) { String key = Number.substring(0, i - 1); logger.info("i: " + i + ", number: " + Number.length() + ", key: " + key); if (e212.containsKey(key)) return e212.get(key); } } return null; }
}
e212.java
@Path("/e212") @Api(value = "/e212", description = "Get Mobile Code Country (E212) from the phone number") @Produces({ "application/json", "application/xml" }) public class e212 {
private static final Logger logger = Logger.getLogger(e212.class);
Rayan958
Messages postés32Date d'inscriptionjeudi 31 décembre 2015StatutMembreDernière intervention 8 janvier 20161 1 janv. 2016 à 23:01
Merci à toi j'ai regardé ça attentivement ;)
Je débute donc oui le pom.xml je l'ai récupérer par hasard et au fil du temps, quand j'aurais compris à quoi servent ses dépendances je les enlèverais ;)
J'ai un autre soucis, j'ai créer une ressource /doc pour y faire apparaître mon swagger (en .json) j'ai créer une fonction de lecture getDoc mais je n'arrive pas à l'afficher : (Le fichier spécifié est introuvable)
KX
Messages postés16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 20243 015 Modifié par KX le 1/01/2016 à 23:53
" le pom.xml je l'ai récupérer par hasard et au fil du temps, quand j'aurais compris à quoi servent ses dépendances je les enlèverais" Quand on lit tes dépendances il y a beaucoup de déchet : utilisation de jboss sur un serveur tomcat, dépendances Scala uniquement pour Swagger, sans oublier les dépendances de servlet qui sont déjà fournies par le serveur...
Avec ton pom.xml le war faisait 30 Mo, avec ma proposition il n'en fait plus que 3 !
C'est pour ça que je t'ai fournie cette structure de projet, pour que tu partes du bon pied...
"j'ai créer une ressource /doc pour y faire apparaître mon swagger (en .json) j'ai créer une fonction de lecture getDoc mais je n'arrive pas à l'afficher" Il n'y a aucun intérêt à appeler une méthode Java pour lire une ressource statique.
Le fichier swagger.json peut être directement exposé par le serveur sans passer par la servlet, il n'y a aucun code à faire, il faut juste le mettre au bon endroit.
En mettant ton fichier dans src/main/webapp/doc/swagger.json tu y accéderas directement avec l'url http://localhost:8080/doc/swagger.json
Rayan958
Messages postés32Date d'inscriptionjeudi 31 décembre 2015StatutMembreDernière intervention 8 janvier 20161 2 janv. 2016 à 01:43
Merci à toi, j'en ai vraiment besoin de le récupérer comme ça sans indiquer le swagger.json. J'ai envi d avoir un countrycode/v1/doc
KX
Messages postés16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 20243 015 1 janv. 2016 à 18:15
Voici une "base propre" pour travailler avec le strict nécessaire.
J'ai pas forcément refait tout ce que tu avais codé, mais l'essentiel y est.
Tu peux démarrer ton serveur en utilisant le plugin Jetty :
mvn jetty:run
Les URL sont ensuite :
http://localhost:8080/rest/v1/countries
http://localhost:8080/rest/v1/countries/e212/208
Voici l'architecture du projet :
Le fichier countries.csv c'est la même chose que ton fichier countries.txt mais avec la première ligne en moins (les en-têtes de colonne), je l'ai placé à la racine de src/main/resources (hiérarchie standard en Maven)
Le bean suivant va permettre de générer automatiquement le JSON à partir de l'objet Java, ce qui évite de manipuler des JSONObject.
Si tu veux ajouter/supprimer/renommer la clé XXX dans le JSON généré il faut considérer la méthode getXXX associée.
package rayan958.countries.bean;
import java.util.List;
public class Country {
private final String name;
private final String alpha2;
private final String alpha3;
private final Integer e212;
private final Integer cc;
private final List<Integer> ndc;
private final String independant;
private final Double latitude;
private final Double longitude;
public Country(String name, String alpha2, String alpha3, Integer e212, Integer cc, List<Integer> ndc, String independant, Double latitude, Double longitude) {
this.name = name;
this.alpha2 = alpha2;
this.alpha3 = alpha3;
this.e212 = e212;
this.cc = cc;
this.ndc = ndc;
this.independant = independant;
this.latitude = latitude;
this.longitude = longitude;
}
public String getName() {
return name;
}
public String getAlpha2() {
return alpha2;
}
public String getAlpha3() {
return alpha3;
}
public Integer getE212() {
return e212;
}
public Integer getCc() {
return cc;
}
public List<Integer> getNdc() {
return ndc;
}
public String getIndependant() {
return independant;
}
public Double getLatitude() {
return latitude;
}
public Double getLongitude() {
return longitude;
}
}
package rayan958.countries.services;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import rayan958.countries.bean.Country;
public final class CountriesService {
private final static List<Country> countriesCache = loadCountries();
private CountriesService() {
}
private static List<Country> loadCountries() {
List<Country> list = new ArrayList<Country>(300);
Scanner sc = new Scanner(Thread.currentThread().getContextClassLoader().getResourceAsStream("countries.csv"), "UTF-8");
while (sc.hasNextLine()) {
Country country = parseCountry(sc.nextLine());
if (country != null)
list.add(country);
}
sc.close();
return list;
}
private static Country parseCountry(String str) {
try {
String[] tab = str.split(";");
return new Country(parseString(tab[0]), parseString(tab[1]), parseString(tab[2]), parseInt(tab[3]), parseInt(tab[4]), parseNdc(tab[5]), parseString(tab[6]), parseDouble(tab[7]), parseDouble(tab[8]));
} catch (RuntimeException e) {
System.err.println("Error parsing country: " + str);
e.printStackTrace();
return null;
}
}
private static List<Integer> parseNdc(String str) {
if (str == null)
return new ArrayList<>(0);
String[] ndc = str.split(",");
List<Integer> ndcList = new ArrayList<>(ndc.length);
for (String s : ndc) {
Integer n = parseInt(s);
if (n != null)
ndcList.add(n);
}
return ndcList;
}
private static String parseString(String str) {
if (str == null)
return null;
str = str.trim();
if (str.isEmpty())
return null;
return str;
}
private static Integer parseInt(String str) {
try {
return Integer.parseInt(str);
} catch (RuntimeException e) {
return null;
}
}
private static Double parseDouble(String str) {
try {
return Double.parseDouble(str);
} catch (RuntimeException e) {
return null;
}
}
public static List<Country> getAll() {
return countriesCache;
}
public static Country getE212(Integer e212) {
if (e212 == null)
return null;
for (Country country : countriesCache)
if (e212.equals(country.getE212()))
return country;
return null;
}
}
Modifié par KX le 1/01/2016 à 23:53
Quand on lit tes dépendances il y a beaucoup de déchet : utilisation de jboss sur un serveur tomcat, dépendances Scala uniquement pour Swagger, sans oublier les dépendances de servlet qui sont déjà fournies par le serveur...
Avec ton pom.xml le war faisait 30 Mo, avec ma proposition il n'en fait plus que 3 !
C'est pour ça que je t'ai fournie cette structure de projet, pour que tu partes du bon pied...
"j'ai créer une ressource /doc pour y faire apparaître mon swagger (en .json) j'ai créer une fonction de lecture getDoc mais je n'arrive pas à l'afficher"
Il n'y a aucun intérêt à appeler une méthode Java pour lire une ressource statique.
Le fichier swagger.json peut être directement exposé par le serveur sans passer par la servlet, il n'y a aucun code à faire, il faut juste le mettre au bon endroit.
En mettant ton fichier dans src/main/webapp/doc/swagger.json tu y accéderas directement avec l'url http://localhost:8080/doc/swagger.json
2 janv. 2016 à 01:43