1313import com .fasterxml .jackson .databind .type .TypeFactory ;
1414import com .fasterxml .jackson .datatype .jdk8 .Jdk8Module ;
1515import com .fasterxml .jackson .datatype .jsr310 .JavaTimeModule ;
16- import com .fasterxml .jackson .module .blackbird .BlackbirdModule ;
1716import com .fasterxml .jackson .module .paramnames .ParameterNamesModule ;
1817import io .jooby .Body ;
1918import io .jooby .Context ;
2827import javax .annotation .Nonnull ;
2928import java .io .InputStream ;
3029import java .lang .reflect .Type ;
30+ import java .util .HashMap ;
3131import java .util .HashSet ;
32+ import java .util .Map ;
3233import java .util .Set ;
34+ import java .util .stream .Stream ;
3335
3436/**
3537 * JSON module using Jackson: https://jooby.io/modules/jackson.
7577 * @since 2.0.0
7678 */
7779public class JacksonModule implements Extension , MessageDecoder , MessageEncoder {
80+ private final MediaType mediaType ;
81+
7882 private final ObjectMapper mapper ;
7983
8084 private final TypeFactory typeFactory ;
8185
8286 private final Set <Class <? extends Module >> modules = new HashSet <>();
8387
88+ private static final Map <String , MediaType > defaultTypes = new HashMap <>();
89+
90+ static {
91+ defaultTypes .put ("XmlMapper" , MediaType .xml );
92+ }
93+
8494 /**
8595 * Creates a Jackson module.
8696 *
8797 * @param mapper Object mapper to use.
98+ * @param contentType Content type.
8899 */
89- public JacksonModule (@ Nonnull ObjectMapper mapper ) {
100+ public JacksonModule (@ Nonnull ObjectMapper mapper , @ Nonnull MediaType contentType ) {
90101 this .mapper = mapper ;
91102 this .typeFactory = mapper .getTypeFactory ();
103+ this .mediaType = contentType ;
104+ }
105+
106+ /**
107+ * Creates a Jackson module.
108+ *
109+ * @param mapper Object mapper to use.
110+ */
111+ public JacksonModule (@ Nonnull ObjectMapper mapper ) {
112+ this (mapper , defaultTypes .getOrDefault (mapper .getClass ().getSimpleName (), MediaType .json ));
92113 }
93114
94115 /**
95- * Creates a Jackson module using the default object mapper from {@link #create()}.
116+ * Creates a Jackson module using the default object mapper from {@link #create(Module... )}.
96117 */
97118 public JacksonModule () {
98119 this (create ());
@@ -111,11 +132,12 @@ public JacksonModule module(Class<? extends Module> module) {
111132 }
112133
113134 @ Override public void install (@ Nonnull Jooby application ) {
114- application .decoder (MediaType . json , this );
115- application .encoder (MediaType . json , this );
135+ application .decoder (mediaType , this );
136+ application .encoder (mediaType , this );
116137
117138 ServiceRegistry services = application .getServices ();
118- services .put (ObjectMapper .class , mapper );
139+ Class mapperType = mapper .getClass ();
140+ services .put (mapperType , mapper );
119141
120142 // Parsing exception as 400
121143 application .errorCode (JsonParseException .class , StatusCode .BAD_REQUEST );
@@ -129,7 +151,7 @@ public JacksonModule module(Class<? extends Module> module) {
129151 }
130152
131153 @ Override public byte [] encode (@ Nonnull Context ctx , @ Nonnull Object value ) throws Exception {
132- ctx .setDefaultResponseType (MediaType . json );
154+ ctx .setDefaultResponseType (mediaType );
133155 return mapper .writer ().writeValueAsBytes (value );
134156 }
135157
@@ -152,18 +174,19 @@ public JacksonModule module(Class<? extends Module> module) {
152174
153175 /**
154176 * Default object mapper. Install {@link Jdk8Module}, {@link JavaTimeModule},
155- * {@link ParameterNamesModule} and {@link BlackbirdModule} .
177+ * {@link ParameterNamesModule}.
156178 *
179+ * @param modules Extra/additional modules to install.
157180 * @return Object mapper instance.
158181 */
159- public static @ Nonnull ObjectMapper create () {
160- ObjectMapper mapper = JsonMapper .builder ()
182+ public static @ Nonnull ObjectMapper create (Module ... modules ) {
183+ JsonMapper . Builder builder = JsonMapper .builder ()
161184 .addModule (new ParameterNamesModule ())
162185 .addModule (new Jdk8Module ())
163- .addModule (new JavaTimeModule ())
164- . addModule ( new BlackbirdModule ())
165- . build ( );
186+ .addModule (new JavaTimeModule ());
187+
188+ Stream . of ( modules ). forEach ( builder :: addModule );
166189
167- return mapper ;
190+ return builder . build () ;
168191 }
169192}
0 commit comments