Problema al devolver el valor JSON

No recibo respuesta porque los datos de tipo JSON del servidor.

Estoy usando el plugin JSON.

jQuery( "#dialog-form" ).dialog({ autoOpen: false, height: 500, width: 750, modal: true, buttons :{ "Search" : function(){ jQuery.ajax({type : 'POST', dataType : 'json', url : '', success : handledata}) } } }); var handledata = function(data) { alert(data); } 

Si dataType = 'json' no recibo ninguna respuesta, pero si no menciono ningún dataType , dataType el formato HTML de la página.

 public String list(){ JSONObject jo = new JSONObject(); try { Iterator it = findList.iterator(); while(it.hasNext()){ SearchResult part = (SearchResult) it.next(); jo.put("col1",part.getcol1()); jo.put("col2",part.getcol2()); } log.debug("--------->:"+jo.toString()); } catch (Exception e) { log.error(e); } return jo.toString(); } 

struts.xml:

      

Página JSP:

 
<textarea id="products" name="prodnbr"

Error de consola:

org.apache.struts2.dispatcher.Dispatcher – No se pudo encontrar la acción o el resultado No se definió ningún resultado para la acción de acción. Parte y resultado {“col1”: “col1”, “col2”: “col2”}

web.xml :

    /parts Parts List Web App  struts-cleanup org.apache.struts2.dispatcher.ActionContextCleanUp   sitemesh com.opensymphony.module.sitemesh.filter.PageFilter   struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  actionPackages com.action    struts-cleanup /*   sitemesh /* REQUEST FORWARD INCLUDE   struts2 /*   java.lang.Throwable /errorPage.jsp   404 /errorPage.jsp    contextConfigLocation /WEB-INF/applicationContext.xml   org.springframework.web.context.ContextLoaderListener   

No estoy obteniendo datos para el éxito de jQuery. Por favor corrígeme, ¿qué está mal aquí?

dataType : 'json' Ajax utiliza un tipo de datos dataType : 'json' para especificar un tipo de datos que se espera que devuelva la función de callback correcta cuando se ejecuta la acción y el resultado, y se devuelve una respuesta del servidor.

dataType (valor predeterminado: Intelligent Guess ( xml , json , script o html ))

Tipo: String

El tipo de datos que espera del servidor. Si no se especifica ninguno, jQuery intentará inferirlo basándose en el tipo MIME de la respuesta (un tipo MIME XML arrojará XML, en 1.4 JSON arrojará un objeto JavaScript, en 1.4 script ejecutará el script, y cualquier otra cosa será devuelto como una cadena).

La URL debe apuntar correctamente a la asignación de acciones. Supongamos que estará en el espacio de nombres predeterminado, de lo contrario debería modificar el URL y la asignación para agregar el atributo del namespace .

  

No es necesario JSONObject el tipo de resultado json si JSONObject el JSONObject manualmente. Puede devolver el texto como resultado de la transmisión y luego convertir una cadena a JSON si es necesario.

struts.xml :

    text/html stream    

Acción:

 public class PartAction extends ActionSupport { public class SearchResult { private String col1; private String col2; public String getCol1() { return col1; } public void setCol1(String col1) { this.col1 = col1; } public String getCol2() { return col2; } public void setCol2(String col2) { this.col2 = col2; } public SearchResult(String col1, String col2) { this.col1 = col1; this.col2 = col2; } } private InputStream stream; //getter here public InputStream getStream() { return stream; } private List findList = new ArrayList<>(); public List getFindList() { return findList; } public void setFindList(List findList) { this.findList = findList; } private String list() { JSONObject jo = new JSONObject(); try { for (SearchResult part : findList) { jo.put("col1", part.getCol1()); jo.put("col2", part.getCol2()); } System.out.println("--------->:"+jo.toString()); } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); } return jo.toString(); } @Action(value="part", results = { @Result(name="stream", type="stream", params = {"contentType", "text/html", "inputName", "stream"}), @Result(name="stream2", type="stream", params = {"contentType", "application/json", "inputName", "stream"}), @Result(name="json", type="json", params={"root", "findList"}) }) public String finder() { findList.add(new SearchResult("val1", "val2")); stream = new ByteArrayInputStream(list().getBytes()); return "stream2"; } } 

He colocado diferentes resultados con el tipo de resultado y el tipo de contenido para describir mejor la idea. Puede devolver cualquiera de estos resultados y devolver el objeto JSON codificado o no. La versión codificada requiere analizar los datos devueltos para obtener el objeto JSON. También puede elegir qué tipo de resultado se serializa mejor para satisfacer sus necesidades, pero mi objective era mostrar que si necesita serializar el objeto simple, entonces el complemento json no es necesario para que funcione.

Referencias

  • ¿Cómo podemos devolver una cadena de texto como respuesta?
  • Cómo convertir JSONObject a string

Acerca del plugin Struts2-JSON

Struts2 JSON Plugin funciona de una manera particular:

El complemento JSON proporciona un tipo de resultado “json” que serializa acciones en JSON.

Serializa toda la acción en JSON, excepto

  • propiedades transitorias
  • propiedades sin Getter

Si no desea que se serialice toda la Acción, sino solo un objeto de su elección, puede especificar un Objeto raíz:

Utilice el atributo “raíz” (expresión OGNL) para especificar el objeto raíz que se serializará.

se puede hacer en struts.xml esta manera:

   objectToBeSerialized   

mientras que la Acción debería tener:

 private CustomObject objectToBeSerialized; public CustomObject getObjectToBeSerialized(){ return this.objectToBeSerialized; } 

Donde CustomObject puede ser un Primitivo, una Cadena, una Matriz, etc.

Utilizándolo de esta manera (la forma en que está diseñado), puede devolver SUCCESS y ERROR como en cualquier otra acción de AJAX Struts2, sin romper las convenciones marco, y acceder al objeto JSON en serie desde la función de callback de AJAX jQuery como cualquier otro campo (si usa rootObject, los “datos” de var handledata = function(data) serían su objeto, de lo contrario sería su acción).


Acerca de su caso específico

En su caso, suponiendo que su estructura de objeto se parece a esto

 row1 [col1, col2], row2 [col1, col2], rowN [col1, col2] 

podrías crear una Lista de un objeto con dos columnas:

Objeto de valor

 public class MyRow implements Serializable { private static final long serialVersionUID = 1L; private String col1; private String col2; // Getters public String getCol1(){ return this.col1; } public String getCol2(){ return this.col2; } } 

Clase de acción

 public class PartAction implements Serializable { private static final long serialVersionUID = 1L; private List rows; // Getter public List getRows() { return this.rows; } public String finder() { String result = Action.SUCCESS; rows = new ArrayList(); try { Iterator it = findList.iterator(); while(it.hasNext()) { SearchResult part = (SearchResult) it.next(); MyRow row = new MyRow(); row.setCol1(part.getcol1()); row.setCol2(part.getcol2()); rows.add(row); } } catch (Exception e) { result = Action.ERROR; log.error(e); } return result; } } 

Struts.xml

     rows     

Para probarlo en la función de callback de AJAX, simplemente use $.each :

 var handledata = function(data) { $.each(data, function(index) { alert(data[index].col1); alert(data[index].col2); }); } 

Por supuesto, puede usar una List> lugar de un objeto Personalizado, o cualquier otra estructura de objeto que desee más que esto: fue solo para obtener la idea.