2011-10-24 2 views
1

J'ai un projet Spring MVC 3/J2EE. Les contrôleurs de rendu jsp fonctionnent correctement, mais le contrôleur qui affiche XML pour Ajax ne fonctionne pas. J'utilise JDK 1.6 dans RAD 7.5, donc JAXB devrait être sur le classpath, et j'ai même essayé d'ajouter les derniers jars JAXB au fichier lib pour être sûr. Je reçois toujours une erreur 406 lorsque je fais l'appel. Mon appel DOJO a handleAs: "xml", et j'ai confirmé que application/xml est sur l'en-tête Accept via FireBug. J'ai la ligne <mvc:annotation-driven /> dans mon fichier print xml servlet. Je peux voir la méthode invoquée et renvoyée sans erreur. Je ne suis pas sûr de ce que je devrais essayer de déboguer.@ResponseBody ne produit pas XML en Java 6

//Country is a class with only primative types which implements Serializable. 
public @ResponseBody List<Country> getCountries(){ 
    return addressService.getCountries(); 
} 

function loadData(){ 
    console.log("Before get ..."); 
    dojo.xhrGet({ 
     url:"http://localhost:9080/sample/shared/getCountries.htm", 
     handleAs:"xml", 
     load: function(data){ 
      console.log("In load function ..."); 
      try { 
       for(var i in data){ 
        console.log("key", i, "value", data[i]); 
       } 
      }catch (ex){ 
       console.error("Failure in load function: " + ex); 
      } 
      console.log("Exiting load function ..."); 
     }, 
     error: function(x){ 
      console.error("Error in ajax ..."); 
      console.error(x); 
     }, 
     failOk: false 
    }); 
    console.log("After get ..."); 
} 

Répondre

4

Essayez de créer la classe wrapper suivante:

@XmlRootElement 
class Countries { 
    private List<Country> countries = new ArrayList<Country>() 

    //getters/setters 
} 

et le retourner du contrôleur au lieu d'une liste brute:

public @ResponseBody Countries getCountries() 

Très probablement votre problème est causé par JAXB qui est incapable de maréchal Liste Java (il ne sait pas comment nommer la balise racine du document XML). Notez que votre problème ne se produit probablement pas lors de la demande de données dans JSON (si Jackson est disponible sur votre CLASSPATH).

Voir aussi (problèmes similaires):

+0

Je serais surpris si cela provoquerait le '406', cependant, je suis d'accord qu'un emballage est nécessaire. – SingleShot

+0

Oui, j'ai vu ça dans une autre réponse. Essayer aujourd'hui. –

1

Difficile à dire sans voir comment vous avez configuré vos vues/résolveurs vue. Toutefois, l'URL côté client contenant un .htm est suspect pour moi, surtout si vous utilisez un ContentNegotiatingViewResolver. Je recommande de laisser tomber l'extension de fichier. Les navigateurs utilisent automatiquement un en-tête Accept pour le HTML, donc pas besoin d'utiliser une extension.

+0

Il est évident que le résolveur de vue fonctionne correctement depuis "je peux voir la méthode invoquée et le retour sans erreur." –

+0

Désolé, n'était pas assez rapide pour vous :-). –

+0

La "méthode de retour" se produit avant la résolution de la vue et n'est donc pas un indicateur de la configuration correcte du côté serveur. – SingleShot