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:
parent
08896d72bc
commit
4305025d42
|
@ -1,8 +1,5 @@
|
||||||
package org.baeldung.config;
|
package org.baeldung.config;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.baeldung.config.converter.KryoHttpMessageConverter;
|
import org.baeldung.config.converter.KryoHttpMessageConverter;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.context.annotation.Configuration;
|
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.EnableWebMvc;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
|
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
|
* Please note that main web configuration is in src/main/webapp/WEB-INF/api-servlet.xml
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package org.baeldung.web.controller.mediatypes;
|
package org.baeldung.web.controller.mediatypes;
|
||||||
|
|
||||||
import org.baeldung.web.dto.BaeldungItem;
|
import org.baeldung.web.dto.BaeldungItem;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.baeldung.web.dto.BaeldungItemSecondVersion;
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
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.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
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")
|
@RequestMapping(value = "/", produces = "application/vnd.baeldung.api.v1+json")
|
||||||
public class CustomMediaTypeController {
|
public class CustomMediaTypeController {
|
||||||
|
|
||||||
@RequestMapping(value = "/public/api/endpoint", produces = "application/vnd.baeldung.api.v1+json")
|
@RequestMapping(method = RequestMethod.GET, value = "/public/api/endpoint", produces = "application/vnd.baeldung.api.v1+json")
|
||||||
public @ResponseBody ResponseEntity<BaeldungItem> getItem() {
|
public @ResponseBody BaeldungItem getItem() {
|
||||||
return new ResponseEntity<>(new BaeldungItem("itemId1"), HttpStatus.OK);
|
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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,36 +1,37 @@
|
||||||
package org.baeldung.web.controller.mediatypes;
|
package org.baeldung.web.controller.mediatypes;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import com.jayway.restassured.http.ContentType;
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
import org.springframework.test.context.support.AnnotationConfigContextLoader;
|
import org.springframework.test.context.support.AnnotationConfigContextLoader;
|
||||||
|
|
||||||
import com.jayway.restassured.RestAssured;
|
import static com.jayway.restassured.RestAssured.given;
|
||||||
import com.jayway.restassured.response.Response;
|
|
||||||
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@ContextConfiguration(classes = { TestConfig.class }, loader = AnnotationConfigContextLoader.class)
|
@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class)
|
||||||
public class CustomMediaTypeControllerLiveTest {
|
public class CustomMediaTypeControllerLiveTest {
|
||||||
private static final String URL_PREFIX = "http://localhost:8082/spring-rest";
|
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
|
@Test
|
||||||
public void whenGet_receiveCustomMediaType() {
|
public void givenServiceEndpoint_whenGetRequestFirstAPIVersion_thenShouldReturn200() {
|
||||||
// given
|
given()
|
||||||
String url = URL_PREFIX + "/public/api/endpoint";
|
.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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,12 @@ public class CustomMediaTypeControllerTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@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());
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -3,6 +3,7 @@ package org.baeldung.web.controller.mediatypes;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@ComponentScan({ "org.baeldung.web" })
|
@ComponentScan({ "org.baeldung.web" })
|
||||||
public class TestConfig {
|
public class TestConfig {
|
||||||
|
|
Loading…
Reference in New Issue