diff --git a/src/main/java/de/thm/arsnova/config/AppConfig.java b/src/main/java/de/thm/arsnova/config/AppConfig.java index 90daa04dea823fa5e33ae2a806db9d33267fea62..767331d933e3346c9aea137ae97f92d9f4cce45f 100644 --- a/src/main/java/de/thm/arsnova/config/AppConfig.java +++ b/src/main/java/de/thm/arsnova/config/AppConfig.java @@ -18,6 +18,7 @@ package de.thm.arsnova.config; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.SerializationFeature; import de.thm.arsnova.ImageUtils; import de.thm.arsnova.connector.client.ConnectorClient; import de.thm.arsnova.connector.client.ConnectorClientImpl; @@ -86,6 +87,8 @@ import java.util.List; ignoreResourceNotFound = true ) public class AppConfig extends WebMvcConfigurerAdapter { + public static final MediaType API_V2_MEDIA_TYPE = new MediaType("application", "vnd.de.thm.arsnova.v2+json"); + public static final MediaType API_V3_MEDIA_TYPE = new MediaType("application", "vnd.de.thm.arsnova.v3+json"); @Autowired private Environment env; @@ -101,11 +104,13 @@ public class AppConfig extends WebMvcConfigurerAdapter { @Value(value = "${socketio.ssl.jks-password:}") private String socketKeystorePassword; @Value(value = "${security.cors.origins:}") private String[] corsOrigins; @Value(value = "${mail.host}") private String mailHost; + @Value(value = "${api.indent-response-body:false}") private boolean apiIndent; @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(stringMessageConverter()); - converters.add(jsonMessageConverter()); + converters.add(defaultJsonMessageConverter()); + converters.add(apiV2JsonMessageConverter()); //converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); } @@ -114,7 +119,7 @@ public class AppConfig extends WebMvcConfigurerAdapter { configurer.mediaType("json", MediaType.APPLICATION_JSON_UTF8); configurer.mediaType("xml", MediaType.APPLICATION_XML); configurer.mediaType("html", MediaType.TEXT_HTML); - configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8); + configurer.defaultContentType(API_V3_MEDIA_TYPE); configurer.favorParameter(true); configurer.favorPathExtension(false); } @@ -163,13 +168,38 @@ public class AppConfig extends WebMvcConfigurerAdapter { } @Bean - public MappingJackson2HttpMessageConverter jsonMessageConverter() { + public MappingJackson2HttpMessageConverter defaultJsonMessageConverter() { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); - builder.serializationInclusion(JsonInclude.Include.NON_EMPTY); - builder.defaultViewInclusion(false); - builder.indentOutput(true).simpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + builder + .serializationInclusion(JsonInclude.Include.NON_EMPTY) + .defaultViewInclusion(false) + .indentOutput(apiIndent) + .simpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build()); + List<MediaType> mediaTypes = new ArrayList<>(); + mediaTypes.add(API_V3_MEDIA_TYPE); + mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); + converter.setSupportedMediaTypes(mediaTypes); + + return converter; + } + + @Bean + public MappingJackson2HttpMessageConverter apiV2JsonMessageConverter() { + Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); + builder + .serializationInclusion(JsonInclude.Include.NON_EMPTY) + .defaultViewInclusion(false) + .indentOutput(apiIndent) + .featuresToEnable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .featuresToEnable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS); + MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build()); + List<MediaType> mediaTypes = new ArrayList<>(); + mediaTypes.add(API_V2_MEDIA_TYPE); + mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); + converter.setSupportedMediaTypes(mediaTypes); - return new MappingJackson2HttpMessageConverter(builder.build()); + return converter; } @Bean