2011-02-11 18 views
5

Estoy intentando llamar al método serveResource() de un portlet utilizando jQuery/ajax. Me las arreglé para obtener un portlet JSR-286 simple que funciona en Pluto 2.0 que es capaz de leer una cadena JSON del cuerpo de la solicitud, crear un objeto Java desde el JSON y devolver ese objeto aString() a mi JavaScript llamante. Sin embargo, cuando implemento * el mismo portlet en WebSphere Portal 6.1, el cuerpo de la solicitud está vacío cuando llega a serveResource().Llamada de Ajax a GenericPortlet.serveResource() en WebSphere Portal 6.1

Supongo que me falta algo básico/fundamental por lo que cualquier consejo sería apreciado. Creo que podría hacer funcionar mi muestra si insertara la cadena JSON en los parámetros de la URL, pero preferiría evitar ese enfoque por ahora, a menos que me den una razón por la cual mi enfoque actual es "malo".

Editar: * Para ser más específicos, implementé el mismo portlet para WAS7 que ejecuta un productor de WSRP y que consume el portlet a través de WebSphere Portal 6.1.

Javascript Fragmento:

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 Fragmento:

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); 
    } 
} 

Respuesta

1

Finalmente tengo trabajo ... más o menos.

Al cambiar el parámetro contentType en mi llamada ajax a 'application/x-www-form-urlencoded' (y jugar con diferentes métodos de representación de mis datos) ahora tengo mis datos disponibles en el cuerpo de la publicación en mi entorno WebSphere , aunque en forma de parámetro de URL en oposición a JSON.

Lamentablemente, realizar este cambio ha resultado en la ruptura de la funcionalidad de Plutón. El cuerpo de la solicitud en ese entorno ahora está vacío.

Ahora bien para cambiar el código para recuperar los datos de request.getParameter() (que creo que funciona en ambos entornos con mi cambio pero requiere más pruebas) o encontrar un contentType que dará como resultado un cuerpo de solicitud rellenado en ambos ambientes.

0

Como está publicando un tipo de datos de solicitud JSON debe ser JSON.

dataType: 'JSON',

Cuestiones relacionadas