2013-10-24 21 views
7

Ho creato un semplice servizio REST con due risorse. La prima risorsa funziona alla grande e restituisce semplicemente MediaType.TEXT_PLAIN.Glassfish JAX-RS Mapping JSON Esempio semplice Errore interno del server 500 Nessun registro prodotto

Per la seconda risorsa ho voluto provare la mappatura POJO a Java e seguirono questo esempio:

https://github.com/jersey/jersey/tree/2.3.1/examples/json-moxy/src/main/java/org/glassfish/jersey/examples/jsonmoxy

con il mio testbean definita come:

@XmlRootElement 
public class Company { 

    public String name; 
    public String symbol; 
    public String country; 

    public Company(String name, String symbol, 
      String country) { 
     this.name = name; 
     this.symbol = symbol; 
     this.country = country; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getSymbol() { 
     return symbol; 
    } 

    public String getCountry() { 
     return country; 
    } 
} 

La risorsa è banale pure:

@Path("company/{name}") 
public class CompanyResource { 

    private Map<String, Company> companies; 

    public CompanyResource() { 
     companies = new LinkedHashMap<String, Company>(); 
     companies.put("Apple", new Company("Apple Inc.", "AAPL", "USA")); 
     companies.put("Microsoft", new Company("Microsoft Corp.", "MSFT", "USA")); 
     companies.put("Honda", new Company("Honda Motor Co Ltd", "HMC", "Japan")); 
     companies.put("Random", new Company("Random Inc.", "RND", "Undefined")); 
    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Company getCompany(@PathParam("name") String name) { 
     Company cmp = companies.get(name); 
     if (cmp == null) { 
      return companies.get("Random"); 
     } 
     return cmp; 
    } 
} 

Ho eseguito il debug di una richiesta e arri ve alla dichiarazione di ritorno senza problemi. Da qui, tuttavia, penso che venga lanciata una JAXBException, ma non sono in grado di visualizzare i dettagli e nulla viene visualizzato in nessun registro. Tutto ciò che accade è che il browser visualizza un messaggio "Errore interno del server 500".

Sotto configurazione di monitoraggio ho disperatamente impostato tutto al livello HIGH. Ancora nulla sembra da nessuna parte.

Le uniche domande simili che ho trovato erano jax-rs 2.0 and Glassfish 4 unable to @consume JSON into Pojo e JAX RS Jersey + JSON --> HTTP 500 Internal Server Error ma non sembravano del tutto correlate.

Per il cliente sto semplicemente utilizzando Google Chrome con l'app "Advanced REST Client".

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

11

Sarà necessario fornire un costruttore no-arg sulla classe Company. Se vuoi limitare chi può accedere al costruttore, puoi renderlo privato.

private Company() { 
} 
+1

non posso credere che fosse così facile ... Grazie, funziona alla grande ora! – UmaN

+0

@UmaN - Il team di Jersey è anche a conoscenza del problema di registrazione e sta esaminando il problema. –

+0

Grazie grazie grazie grazie !! – jahroy

0

Prova a mettere il "nome" param nel metodo non nella classe come questa:

@Path("company") 
public class CompanyResource { 

    private Map<String, Company> companies; 

    public CompanyResource() { 
     companies = new LinkedHashMap<String, Company>(); 
     companies.put("Apple", new Company("Apple Inc.", "AAPL", "USA")); 
     companies.put("Microsoft", new Company("Microsoft Corp.", "MSFT", "USA")); 
     companies.put("Honda", new Company("Honda Motor Co Ltd", "HMC", "Japan")); 
     companies.put("Random", new Company("Random Inc.", "RND", "Undefined")); 
    } 

    @GET @PathParam("{name}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Company getCompany(@PathParam("name") String name) { 
     Company cmp = companies.get(name); 
     if (cmp == null) { 
      return companies.get("Random"); 
     } 
     return cmp; 
    } 
} 

se si desidera utilizzare nel modo che ha mostrato, è necessario aggiungere un costruttore con il "nome" come un campo:

public CompanyResource(@PathParam("name") String name) { 
    this.name = name; 
} 
0

One - purtroppo sotto-documentato - problema che può accadere:

Se si dichiara un campo transientnon annotarlo con @XmlTransient. I campi transient sono effettivamente xml-transient e non hai più bisogno dell'annotazione.

Ciò è accaduto quando ho violato questa regola, su un campo desk:

2016-11-30T14:09:33.731-0500|Severe: 
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: IllegalAnnotationException 
Transient field "desk" cannot have any JAXB annotations. 
this problem is related to the following location: 
    at @javax.xml.bind.annotation.XmlTransient() 
    at my.package.Desk