¿Cómo generar respuesta JSON desde JSF?
(4)
He creado una página donde quiero obtener la respuesta JSON de una página JSF, pero cuando intento obtener una página me muestra toda la página html.
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<title>Facelet Title</title></head><body>
[{"value": "21", "name": "Mick Jagger"},{"value": "43", "name": "Johnny Storm"},{"value": "46", "name": "Richard Hatch"},{"value": "54", "name": "Kelly Slater"},{"value": "55", "name": "Rudy Hamilton"},{"value": "79", "name": "Michael Jordan"}]
</body></html>
¿Por qué estás usando jsf para eso? Use un servlet para servir su JSON. Mi sugerencia sería usar una implementación jaxrs, como cxf.
Usé solo un facelet para la salida (pero JSF 1.2)
<f:view contentType="application/json" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<h:outputText value="#{someBean.getJson()}" escape="false"/>
</f:view>
Incluso estoy usando contentType = "text / xhtml" con JSF 2.2 y funciona muy bien. No hay necesidades en renderJson () de la respuesta de BalusC arriba
<f:view encoding="UTF-8" contentType="text/html"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:outputText value="#{stationView.getClosestStationen(param.longitude, param.latitude)}" escape="false"/>
</f:view>
Llamada Ajax:
$.ajax({
url: requestContextPath + ''/rest/stationen.xhtml'',
type: "GET",
data: {
"longitude": x,
"latitude": y
},
dataType: "json",
success: function (data) {
$.each(data, function (i, station) {
...
});
},
error: function () {
...
}
})
JSF es un framework MVC que genera HTML, no un tipo de marco de servicios web REST. Básicamente estás abusando de JSF como un servicio web. Su problema concreto se debe simplemente a la colocación de etiquetas <html>
y así sucesivamente en el archivo de visualización usted mismo .
Si realmente insistes, siempre puedes lograr esto usando <ui:composition>
lugar de <html>
. También debe asegurarse de que se haya utilizado el tipo de contenido correcto de la application/json
, esto es lo predeterminado en JSF, es decir, text/html
.
<ui:composition
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:event type="preRenderView" listener="#{bean.renderJson}" />
</ui:composition>
con
public void renderJson() throws IOException {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.setResponseContentType("application/json");
externalContext.setResponseCharacterEncoding("UTF-8");
externalContext.getResponseOutputWriter().write(someJsonString);
facesContext.responseComplete();
}
Pero recomiendo mirar JAX-RS o JAX-WS en lugar de abusar de JSF como un servicio web JSON. Use la herramienta correcta para el trabajo.