+/*
+ * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.argeo.server.json;
import java.io.IOException;
import org.argeo.server.ServerSerializer;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.map.SerializerFactory;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.ser.StdSerializerProvider;
public class JsonServerSerializer implements ServerSerializer, Serializer {
private final static Log log = LogFactory
private JsonFactory jsonFactory = new JsonFactory();
private ObjectMapper objectMapper = new ObjectMapper();
+ private SerializerProvider serializerProvider = new CustomSerializerProvider();
private Boolean prettyPrint = false;
private String contentTypeCharset = "UTF-8";
+ // private Map<Class<?>,String> ignoredFields = new HashMap<Class<?>,
+ // String>();
+
+ public JsonServerSerializer() {
+ objectMapper.setSerializerProvider(serializerProvider);
+ }
+
+ @SuppressWarnings("restriction")
public void serialize(Object obj, HttpServletRequest request,
HttpServletResponse response) {
if (asHtml)
if (asHtml)
response.getWriter().append("<pre>");
- serialize(response.getWriter(), obj);
+ serialize(obj, response.getWriter());
if (asHtml)
response.getWriter().append("</pre>");
}
}
- public void serialize(Writer writer, Object obj) {
+ public void serialize(Object obj, Writer writer) {
serializeAndLog(obj);
JsonGenerator jsonGenerator = null;
jsonGenerator.useDefaultPrettyPrinter();
objectMapper.writeValue(jsonGenerator, obj);
+ jsonGenerator.flush();
} catch (Exception e) {
throw new ArgeoException("Cannot serialize " + obj, e);
} finally {
}
}
+ @Deprecated
+ public void serialize(Writer writer, Object obj) {
+ serialize(obj, writer);
+ }
+
protected void serializeAndLog(Object obj) {
if (!log.isTraceEnabled())
return;
protected ObjectMapper getObjectMapper() {
return objectMapper;
}
+
+ public void setContentTypeCharset(String contentTypeCharset) {
+ this.contentTypeCharset = contentTypeCharset;
+ }
+
+ static class CustomSerializerProvider extends StdSerializerProvider {
+
+ public CustomSerializerProvider() {
+ super();
+ }
+
+ public CustomSerializerProvider(SerializationConfig config,
+ StdSerializerProvider src, SerializerFactory f) {
+ super(config, src, f);
+ }
+
+ protected StdSerializerProvider createInstance(
+ SerializationConfig config, SerializerFactory jsf) {
+ return new CustomSerializerProvider(config, this, jsf);
+ }
+
+ @Override
+ public JsonSerializer<Object> getUnknownTypeSerializer(
+ Class<?> unknownType) {
+ JsonSerializer<Object> res = new JsonSerializer<Object>() {
+ public void serialize(Object value, JsonGenerator jgen,
+ SerializerProvider provider)
+ throws JsonMappingException {
+ if (log.isDebugEnabled())
+ log.warn("Unknown serializer for "
+ + value.getClass().getName());
+ try {
+ jgen.writeNull();
+ } catch (Exception e) {
+ throw new ArgeoException("Cannot write null", e);
+ }
+ }
+
+ };
+
+ return res;
+ }
+
+ }
}