diff options
| author | Szymon Szukalski <szymon@skas.io> | 2024-07-23 21:25:54 +1000 |
|---|---|---|
| committer | Szymon Szukalski <szymon@skas.io> | 2024-07-23 21:25:54 +1000 |
| commit | 6964e0bc8578abcbdf7e49ffa36c49197df67787 (patch) | |
| tree | 0a6c9124c5f37152172029c8096a64b4f2992501 /src/main | |
| parent | e120a6d1a9e779cdcb1d293245f55f296e77e91a (diff) | |
Enforce text/xml+marker content type for /import endpoint
Diffstat (limited to 'src/main')
4 files changed, 62 insertions, 4 deletions
diff --git a/src/main/java/com/stileeducation/markr/config/WebConfig.java b/src/main/java/com/stileeducation/markr/config/WebConfig.java new file mode 100644 index 0000000..6d9c1a0 --- /dev/null +++ b/src/main/java/com/stileeducation/markr/config/WebConfig.java @@ -0,0 +1,17 @@ +package com.stileeducation.markr.config; + +import com.stileeducation.markr.converter.XmlMarkrMessageConverter; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { + converters.add(new XmlMarkrMessageConverter()); + } +} diff --git a/src/main/java/com/stileeducation/markr/controller/TestResultsController.java b/src/main/java/com/stileeducation/markr/controller/TestResultsController.java index f5f8a44..5667027 100644 --- a/src/main/java/com/stileeducation/markr/controller/TestResultsController.java +++ b/src/main/java/com/stileeducation/markr/controller/TestResultsController.java @@ -20,8 +20,8 @@ public class TestResultsController { this.testResultsService = testResultsService; } - // TODO - update to consume text/xml+markr, consider return value - @PostMapping(value = IMPORT_ENDPOINT, consumes = "application/xml", produces = "application/json") + // TODO consider return value + @PostMapping(value = IMPORT_ENDPOINT, consumes = "text/xml+markr", produces = "application/json") public ResponseEntity<Void> handleXmlRequest(@RequestBody MCQTestResultsDTO testResults) { testResultsService.importTestResults(testResults); return new ResponseEntity<>(HttpStatus.NO_CONTENT); diff --git a/src/main/java/com/stileeducation/markr/converter/XmlMarkrMessageConverter.java b/src/main/java/com/stileeducation/markr/converter/XmlMarkrMessageConverter.java new file mode 100644 index 0000000..04207a1 --- /dev/null +++ b/src/main/java/com/stileeducation/markr/converter/XmlMarkrMessageConverter.java @@ -0,0 +1,43 @@ +package com.stileeducation.markr.converter; + +import com.stileeducation.markr.dto.MCQTestResultsDTO; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.Marshaller; +import jakarta.xml.bind.Unmarshaller; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter; + +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import java.util.Collections; +import java.util.List; + +public class XmlMarkrMessageConverter extends AbstractXmlHttpMessageConverter<MCQTestResultsDTO> { + + public static final MediaType MEDIA_TYPE = new MediaType("text", "xml+markr"); + + @Override + protected MCQTestResultsDTO readFromSource(Class<? extends MCQTestResultsDTO> clazz, HttpHeaders headers, Source source) throws Exception { + JAXBContext jaxbContext = JAXBContext.newInstance(MCQTestResultsDTO.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + return (MCQTestResultsDTO) unmarshaller.unmarshal(source); + } + + @Override + protected void writeToResult(MCQTestResultsDTO testResultsDTO, HttpHeaders headers, Result result) throws Exception { + JAXBContext jaxbContext = JAXBContext.newInstance(MCQTestResultsDTO.class); + Marshaller marshaller = jaxbContext.createMarshaller(); + marshaller.marshal(testResultsDTO, result); + } + + @Override + protected boolean supports(Class<?> clazz) { + return MCQTestResultsDTO.class.isAssignableFrom(clazz); + } + + @Override + public List<MediaType> getSupportedMediaTypes() { + return Collections.singletonList(MEDIA_TYPE); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 17a7c25..7e171c2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1 @@ spring.application.name=markr -spring.mvc.converters.preferred-json-mapper=jackson -spring.mvc.converters.preferred-xml-mapper=jackson |
