Deseo devolver una vista desde un controlador Spring MVC según la lógica. Si ocurre un error, quiero devolver JSON, si no, una vista HTML. Esto es como ASP.NET MVC ActionResult, donde puede devolver cualquier tipo de vista y mostrará el resultado, y no dependerá del tipo de contenido que se envíe en la solicitud. No puedo encontrar ningún ejemplo de esto.Retorno JSON o vista desde el controlador MVC de Spring
Respuesta
Lo logré con lo siguiente.
@RequestMapping(value="/users", method=RequestMethod.POST)
public Object index(@RequestBody SearchUsersViewModel model, HttpServletResponse response) {
model.setList(userService.getUsers(model));
if(true)
{
return new ModelAndView("controls/tables/users", "model", model);
}
else
{
return JsonView.Render(model, response);
}
}
JsonView.java
public class JsonView {
public static ModelAndView Render(Object model, HttpServletResponse response)
{
MappingJacksonHttpMessageConverter jsonConverter = new MappingJacksonHttpMessageConverter();
MediaType jsonMimeType = MediaType.APPLICATION_JSON;
try {
jsonConverter.write(model, jsonMimeType, new ServletServerHttpResponse(response));
} catch (HttpMessageNotWritableException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
Función JS que hace la llamada
config.request = $
.ajax({
url : url,
data : $.toJSON(def.data),
type : def.type,
dataType : def.dataType,
processData : true,
contentType : def.contentType,
success : function(data) {
try {
var json = data;
if (typeof data === "String" || typeof data == "string") {
json = (eval('(' + data + ')'));
}
if ('object' === typeof json) {
if (json.Validation && json.Validation.Errors.length > 0) {
$.each(json.Validation.Errors, function() {
// Error Code Check
});
// Error Callback
if (typeof (def.errorCallback) == 'function') {
def.errorCallback(json);
}
} else {
def.callback(data);
}
} else {
def.callback(data);
}
} catch (e) {
def.callback(data);
// Hide Loading
}
},
error : function(data) {
}
});
En su código tiene 'if (true)' - entonces, ¿cuándo se devuelve JSON? – Paul
Estaba probando allí. Probaría un error en el objeto de retorno y luego devolveré json; de lo contrario, devolvería HTML. –
Quizás pueda mirar ResolveBundleViewResolver, que le permite mezclar vistas. El docs brinda información sobre cómo usar esto.
A partir de los documentos (ejemplo es mezclar los azulejos y jstl, pero debe aplicarse para otros también) ...
archivo de contexto
<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="views"/>
</bean>
views.properties
...
welcomeView.(class)=org.springframework.web.servlet.view.tiles2.TilesView
welcomeView.url=welcome (this is the name of a Tiles definition)
vetsView.(class)=org.springframework.web.servlet.view.tiles2.TilesView
vetsView.url=vetsView (again, this is the name of a Tiles definition)
findOwnersForm.(class)=org.springframework.web.servlet.view.JstlView
findOwnersForm.url=/WEB-INF/jsp/findOwners.jsp
...
Programe su controlador para devolver un nombre de vista lógica diferente dependiendo de una condición. Por ejemplo:
@RequestMapping(value="/hello/{name}", method=RequestMethod.GET)
public ModelAndView hello(@PathVariable String name) {
String viewName = (name.length() > 1) ? "hello" : "error";
ModelAndView mav = new ModelAndView(viewName);
mav.addObject("name", name);
return mav;
}
configurar la vista resolutores para resolver el nombre de vista "error"
a la vista JSON. Primavera ofrece muchas maneras de configurar el nombre de la vista para ver el mapeo, incluyendo:
- XmlViewResolver el que lee los archivos XML de definición de frijol,
- ResourceBundleViewResolver el que lee archivos de propiedades, y
- BeanNameViewResolver que se ve en el contexto de la aplicación de Ejecución de DispatcherServlet para un bean que tiene el mismo nombre que el nombre de la vista.
Por ejemplo, para utilizar BeanNameViewResolver:
<bean name="error" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"/>
</bean>
Por si acaso y que desea volver JSON de excepción se puede hacer lo siguiente:
@ExceptionHandler(Exception.class)
@ResponseBody
public void handleIOException(Exception exception,HttpServletRequest request, HttpServletResponse response) {
response.setContentType("application/json");
String json = "{\"Name\": 50}";
PrintWriter out= response.getWriter();
out.write(json);
}
no estoy seguro de que esto es lo que quería hacer, pero por si acaso ... :)
Si ocurrió un error en un controlador, ¿Esto lo atraparía y devolvería JSON? –
Por lo que recuerdo, sí atraparía. –
No hay nada que le impida devolver una real View
Objeto directamente desde su método de controlador - no tiene que ser un nombre de vista. Por lo tanto, su controlador puede construir un objeto View
utilizando su propia lógica, y devolverlo, con o sin estar envuelto en un objeto ModelAndView
.
Esto es probablemente más simple que tratar de persuadir al marco ViewResolver
para que lo haga por usted, aunque eso también funcionaría.
Para extender la respuesta de Chin Huang, aquí es lo que funciona para mí. No se requiere configuración
response.setStatus(500);
return new ModelAndView(new MappingJacksonJsonView(), model);
Esto convertirá automáticamente el modelo en JSON y escribirá en respuesta. Aquí modelo es de tipo Map<String,Object>
y la respuesta es de tipo HttpServletResponse
Mala idea para instanciar una nueva vista JSON cada vez que necesita devolver una. –
¿Cuál es la buena idea @JukkaDahlbom? –
- 1. Spring 3.0 MVC MVC: etiqueta vista-controlador
- 2. controladores Spring MVC Tipo de retorno
- 3. Vista desde controlador en Java patrón MVC
- 4. Cómo devolver JSON desde el controlador de MVC WEB API
- 5. Vista parcial de retorno de MVC como JSON
- 6. Spring 3 MVC que accede a HttpRequest desde el controlador
- 7. MVC: agregar encabezado http: ¿controlador o vista?
- 8. Devolver JSON desde un método JsonResult en el controlador MVC
- 9. Spring 3 JSON con MVC
- 10. ¿CÓMO? Controlador de retorno nada/vista actual
- 11. Yendo desde el controlador a la vista
- 12. Devolver diferentes vistas desde el controlador MVC
- 13. Spring MVC -> respuesta JSON
- 14. cómo devolver JSON con controlador MVC
- 15. Devolver el mismo controlador de vista utilizando ModelAndView de Spring Web MVC
- 16. Pasando fechas desde la vista al controlador mvc/C#
- 17. ASP.Net MVC: Envío de JSON al controlador
- 18. ¿El controlador Spring-MVC redirige a la página "anterior"?
- 19. Spring MVC o Wicket?
- 20. Extjs4 MVC, ¿cómo obtener Modelo o Vista desde una clase de Controlador?
- 21. Spring MVC, llamando a otro controlador desde Dentro de un controlador
- 22. Spring MVC tutorial desde cero
- 23. MVC Navegue a la vista de controlador diferente
- 24. primavera: devolver JSON desde el controlador como ModelAndVIew
- 25. spring mvc rest response json y xml
- 26. Spring MVC controlador anotada en maravilloso
- 27. Controlador Spring MVC - getPathInfo() es nulo
- 28. Disparador 404 en controlador Spring-MVC?
- 29. ¿Cómo configuro el valor seleccionado en un formulario Spring MVC: seleccione desde el controlador?
- 30. backbone.js - propiedades del controlador desde una vista
http://stackoverflow.com/questions/6173093/spring-return-json-from-controller-as-modelandview – Bozho