Custom media types rest (#944)

* Custom Media Types for REST

* add test, add DTO, remove example of API versioning to make example simpler

* client accept only that custom-media type

* remove not needed new_line

* leave custom media type on class level

* do not need content type header

* GET do not need content-Type

* add liveTest for custom Content type

* Merge branch 'master' of https://github.com/eugenp/tutorials into Custom_media_types_rest

# Conflicts:
#	spring-rest/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java
#	spring-rest/src/main/java/org/baeldung/web/dto/BaeldungItem.java
#	spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerTest.java

* test name proper given_when_then pattern

* add custom content-type 'application/json-p'

* import proper class

* proper test name

* proper API migraton test, SecondBaeldungItem breaks backward compatibility
This commit is contained in:
Tomasz Lelek 2016-12-30 20:14:25 +01:00 committed by Eugen
parent 08896d72bc
commit 4305025d42
6 changed files with 53 additions and 27 deletions

View File

@ -1,8 +1,5 @@
package org.baeldung.config;
import java.text.SimpleDateFormat;
import java.util.List;
import org.baeldung.config.converter.KryoHttpMessageConverter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ -15,6 +12,9 @@ import org.springframework.oxm.xstream.XStreamMarshaller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.text.SimpleDateFormat;
import java.util.List;
/*
* Please note that main web configuration is in src/main/webapp/WEB-INF/api-servlet.xml
*/

View File

@ -1,9 +1,9 @@
package org.baeldung.web.controller.mediatypes;
import org.baeldung.web.dto.BaeldungItem;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.baeldung.web.dto.BaeldungItemSecondVersion;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@ -11,8 +11,13 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping(value = "/", produces = "application/vnd.baeldung.api.v1+json")
public class CustomMediaTypeController {
@RequestMapping(value = "/public/api/endpoint", produces = "application/vnd.baeldung.api.v1+json")
public @ResponseBody ResponseEntity<BaeldungItem> getItem() {
return new ResponseEntity<>(new BaeldungItem("itemId1"), HttpStatus.OK);
@RequestMapping(method = RequestMethod.GET, value = "/public/api/endpoint", produces = "application/vnd.baeldung.api.v1+json")
public @ResponseBody BaeldungItem getItem() {
return new BaeldungItem("itemId1");
}
@RequestMapping(method = RequestMethod.GET, value = "/public/api/endpoint", produces = "application/vnd.baeldung.api.v2+json")
public @ResponseBody BaeldungItemSecondVersion getItemSecondAPIVersion() {
return new BaeldungItemSecondVersion("itemName");
}
}

View File

@ -0,0 +1,14 @@
package org.baeldung.web.dto;
public class BaeldungItemSecondVersion {
private final String itemName;
public BaeldungItemSecondVersion(String itemName) {
this.itemName = itemName;
}
public String getItemName() {
return itemName;
}
}

View File

@ -1,36 +1,37 @@
package org.baeldung.web.controller.mediatypes;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import com.jayway.restassured.http.ContentType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
import com.jayway.restassured.RestAssured;
import com.jayway.restassured.response.Response;
import static com.jayway.restassured.RestAssured.given;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestConfig.class }, loader = AnnotationConfigContextLoader.class)
@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class)
public class CustomMediaTypeControllerLiveTest {
private static final String URL_PREFIX = "http://localhost:8082/spring-rest";
private static final String CUSTOM_CONTENT_TYPE = "application/vnd.baeldung.api.v1+json";
//
@Test
public void whenGet_receiveCustomMediaType() {
// given
String url = URL_PREFIX + "/public/api/endpoint";
public void givenServiceEndpoint_whenGetRequestFirstAPIVersion_thenShouldReturn200() {
given()
.accept("application/vnd.baeldung.api.v1+json")
.when()
.get(URL_PREFIX + "/public/api/endpoint")
.then()
.contentType(ContentType.JSON).and().statusCode(200);
}
// when
Response response = RestAssured.get(url);
// then
assertEquals(200, response.getStatusCode());
assertTrue(response.contentType().contains(CUSTOM_CONTENT_TYPE));
@Test
public void givenServiceEndpoint_whenGetRequestSecondAPIVersion_thenShouldReturn200() {
given()
.accept("application/vnd.baeldung.api.v2+json")
.when()
.get(URL_PREFIX + "/public/api/endpoint")
.then()
.contentType(ContentType.JSON).and().statusCode(200);
}
}

View File

@ -31,7 +31,12 @@ public class CustomMediaTypeControllerTest {
}
@Test
public void shouldSendRequestForItem() throws Exception {
public void givenServiceUrl_whenGetWithProperAcceptHeaderFirstAPIVersion_thenReturn200() throws Exception {
mockMvc.perform(get("/public/api/endpoint").accept("application/vnd.baeldung.api.v1+json")).andExpect(status().isOk());
}
@Test
public void givenServiceUrl_whenGetWithProperAcceptHeaderSecondVersion_thenReturn200() throws Exception {
mockMvc.perform(get("/public/api/endpoint").accept("application/vnd.baeldung.api.v2+json")).andExpect(status().isOk());
}
}

View File

@ -3,6 +3,7 @@ package org.baeldung.web.controller.mediatypes;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({ "org.baeldung.web" })
public class TestConfig {