Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id 'org.springframework.boot' version '3.1.2'
id 'io.spring.dependency-management' version '1.1.0'
id 'java'
id("io.freefair.lombok") version "8.7.1"
}

targetCompatibility = '17'
Expand All @@ -14,6 +15,10 @@ repositories {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation('org.springframework.boot:spring-boot-starter-test')

implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2'
implementation 'com.fasterxml.jackson:jackson-bom:2.15.2'
// implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
}

test {
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/wilkins/showcase/ShowcaseApplication.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.wilkins.showcase;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@Slf4j
@SpringBootApplication
public class ShowcaseApplication {

public static void main(String[] args) {
SpringApplication.run(ShowcaseApplication.class, args);
}

}
15 changes: 15 additions & 0 deletions src/main/java/com/wilkins/showcase/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.wilkins.showcase;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.client.RestTemplateCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Configuration
public class WebConfig implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
log.info("Rest template message converters: {}", restTemplate.getMessageConverters());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.wilkins.showcase.controller;

import org.springframework.http.ContentDisposition;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

import java.io.IOException;
import java.io.OutputStream;

import static org.springframework.http.HttpHeaders.CONTENT_DISPOSITION;
import static org.springframework.http.ResponseEntity.ok;

@RestController
@RequestMapping("/download")
public class DownloadController {
@GetMapping(produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public ResponseEntity<StreamingResponseBody> download() {
return ok()
.header(CONTENT_DISPOSITION, ContentDisposition
.builder("pdf")
.filename("demo.pdf")
.build().toString())
.body(this::writeFileToStream);
}

private void writeFileToStream(OutputStream outputStream) {
try (var inputStream = DownloadController.class.getClassLoader().getResourceAsStream("Test.pdf")) {
outputStream.write(inputStream.readAllBytes());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
6 changes: 6 additions & 0 deletions src/main/java/com/wilkins/showcase/controller/Person.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.wilkins.showcase.controller;

import java.math.BigDecimal;

public record Person(String firstName, String lastName, BigDecimal salary) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.wilkins.showcase.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;

import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
import static org.springframework.http.MediaType.APPLICATION_XML_VALUE;

@RequestMapping("/upload")
@RestController
@Slf4j
public class UploadController {

@PostMapping(consumes = {APPLICATION_XML_VALUE, "application/xml;charset=UTF-8"})
public ResponseEntity<Person> uploadXml(@RequestBody Person person) {
log.info("xml person: {}", person);
var personWithSalary = new Person(person.firstName(), person.lastName(), BigDecimal.valueOf(123456789000000.0));
return ResponseEntity.ok(personWithSalary);
}

@PostMapping(consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
public ResponseEntity<Person> uploadJson(@RequestBody Person person) {
log.info("json person: {}", person);
var personWithSalary = new Person(person.firstName(), person.lastName(), BigDecimal.valueOf(123456789.0));
return ResponseEntity.ok(personWithSalary);
}
}
Binary file added src/main/resources/Test.pdf
Binary file not shown.
5 changes: 5 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
spring:
jackson:
serialization:
WRITE_BIGDECIMAL_AS_PLAIN: true

server:
port: 8080
servlet:
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/public/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<html>
<h1>Demo</h1>
<a href="/download">Download</a>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.wilkins.showcase.controller;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.request;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

class DownloadControllerTest {

MockMvc mockMvc;

@BeforeEach
void beforeEach() {
mockMvc = MockMvcBuilders.standaloneSetup(new DownloadController()).build();
}

@Test
void canDownloadFile() throws Exception {
var result = mockMvc.perform(MockMvcRequestBuilders.get("/download"))
.andExpect(status().isOk())
.andExpect(request().asyncStarted())
.andDo(log())
.andReturn();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.wilkins.showcase.controller;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.http.MediaType;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

class UploadControllerTest {

MockMvc mockMvc;

@BeforeEach
void setUp() {
var messageConverter = new MappingJackson2XmlHttpMessageConverter();
var xmlMapper = new XmlMapper();
xmlMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
messageConverter.setObjectMapper(xmlMapper);
mockMvc = MockMvcBuilders
.standaloneSetup(new UploadController())
.setMessageConverters(messageConverter)
.build();
}

@Test
void canUploadXml() throws Exception {
var response = mockMvc.perform(post("/upload")
.contentType(MediaType.APPLICATION_XML)
.content("""
<Person>
<firstName>Bob</firstName>
<lastName>Fish</lastName>
</Person>
"""))
.andExpect(status().isOk())
.andReturn()
.getResponse()
.getContentAsString();

assertThat(response).doesNotContain("E+");
}

@Test
void canUploadXmlWithEmptyValues() throws Exception {
var response = mockMvc.perform(post("/upload")
.contentType(MediaType.APPLICATION_XML)
.content("""
<Person>
<firstName>Bob</firstName>
<lastName></lastName>
</Person>
"""))
.andExpect(status().isOk())
.andReturn()
.getResponse()
.getContentAsString();

assertThat(response).doesNotContain("E+");
}
}