2011-02-11 1 views
5

J'essaie d'appeler la méthode serveResource() d'un portlet à l'aide de jQuery/ajax. J'ai réussi à faire fonctionner un simple portlet JSR-286 dans Pluto 2.0 capable de lire une chaîne JSON à partir du corps de la requête, de créer un objet Java à partir du JSON et de renvoyer toString() à mon JavaScript appelant. Toutefois, lorsque je déploie * le même portlet vers WebSphere Portal 6.1, le corps de la requête est vide au moment où il atteint serveResource().Appel Ajax à GenericPortlet.serveResource() dans WebSphere Portal 6.1

Je suppose qu'il me manque quelque chose de basique/fondamental donc tout conseil serait apprécié. Je pense que je pourrais faire fonctionner mon exemple si je poussais la chaîne JSON sur les paramètres d'URL mais que j'aurais préféré éviter cette approche pour le moment, à moins que l'on me donne une raison pour laquelle mon approche actuelle est "mauvaise".

Éditer: * Pour être plus précis, j'ai déployé le même portlet sur WAS7 exécutant un producteur WSRP et consommant le portlet via WebSphere Portal 6.1.

Javascript Snippet:

function ajaxPost() { 
    var url = "<%= testServiceURL %>"; 
    var current = $("input.current").val(); 
    $.ajax(
     { 
      url: url, 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'html', 
      data: "{data: " + current + "}", 
      type: 'POST', 
      success: testSuccess, 
      error: testError 
     } 
    ); 
    $("div.trace").append("ajax post fired<br />"); 
} 

function testSuccess(data, textStatus, XMLHttpRequest) 
{ 
    $("div.trace").append("testSuccess(): " + data + "<br />"); 
} 

portlets Snippet:

public class TestPortlet extends GenericPortlet { 
    ... 
    @Override 
    public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException { 
     String res = "Failed to read body"; 

     boolean bodyRead = true; 
     StringBuffer sb = new StringBuffer(); 
     String line = null; 
     try { 
      BufferedReader reader = request.getReader(); 
      line = reader.readLine(); 
      while (line != null) { 
       sb.append(line); 
       line = reader.readLine(); 
      } 
      reader.close(); 
     } catch (Exception e) { 
      bodyRead = false; 
     } 

     Foo f = null; 
     if (bodyRead) { 
      try { 
       Gson gson = new Gson(); 
       f = gson.fromJson(sb.toString(), Foo.class); 
       res = "Received: " + f.toString(); 
      } catch (Exception e) { 
       res = "Failed to convert body into Foo: '" + sb.toString() + "'"; 
      } 
     } 

     response.setContentType("text/html"); 
     response.getWriter().println(res); 
    } 
} 

Répondre

1

a finalement obtenu fonctionner ... en quelque sorte. En changeant le paramètre contentType dans mon appel ajax à 'application/x-www-form-urlencoded' (et en jouant avec différentes méthodes de représentation de mes données), mes données sont désormais disponibles dans le corps du message dans mon environnement WebSphere , bien que dans une forme de paramètre d'URL par opposition à JSON. Malheureusement, l'exécution de ce changement a entraîné la rupture de la fonctionnalité dans la version Pluto. Le corps de la demande dans cet environnement est maintenant vide. Maintenant, soit pour changer le code pour récupérer les données de request.getParameter() (qui, je crois, fonctionne dans les deux environnements avec ma modification, mais nécessite un test supplémentaire) ou trouver un contentType qui aboutira à un corps de requête rempli dans les deux environnements.

0

Lorsque vous envoyez une requête JSON, dataType doit être JSON.

dataType: 'JSON',

Questions connexes