mirror of
https://github.com/spring-projects/spring-petclinic.git
synced 2025-05-22 03:49:36 +00:00
simplify content negotiation setup
- remove custom xml view, use springboot builtin xml view - remove oxm maven dependency - remove json-simple maven dependency (seems not relevant anymore) - update vetsXml test using xpath
This commit is contained in:
parent
aa8cc431eb
commit
077f4eb105
5 changed files with 16 additions and 89 deletions
12
pom.xml
12
pom.xml
|
@ -70,12 +70,6 @@
|
||||||
<groupId>org.springframework</groupId>
|
<groupId>org.springframework</groupId>
|
||||||
<artifactId>spring-context-support</artifactId>
|
<artifactId>spring-context-support</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-oxm</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Tomcat -->
|
<!-- Tomcat -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -204,12 +198,6 @@
|
||||||
<artifactId>datatables-export-itext</artifactId>
|
<artifactId>datatables-export-itext</artifactId>
|
||||||
<version>${dandelion.datatables.version}</version>
|
<version>${dandelion.datatables.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- temporary fix: below dependency should not be necessary as it is a transitive dependency.
|
|
||||||
For some reason we can't build the app unless it is a first level dependency -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.googlecode.json-simple</groupId>
|
|
||||||
<artifactId>json-simple</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<!-- Maven plugin versions are mentioned in order to guarantee the build reproducibility in the long term -->
|
<!-- Maven plugin versions are mentioned in order to guarantee the build reproducibility in the long term -->
|
||||||
|
|
|
@ -16,36 +16,16 @@
|
||||||
|
|
||||||
package org.springframework.samples.petclinic;
|
package org.springframework.samples.petclinic;
|
||||||
|
|
||||||
import com.github.dandelion.core.web.DandelionFilter;
|
|
||||||
import com.github.dandelion.core.web.DandelionServlet;
|
|
||||||
import net.sf.ehcache.config.CacheConfiguration;
|
|
||||||
import net.sf.ehcache.config.PersistenceConfiguration;
|
|
||||||
import net.sf.ehcache.config.PersistenceConfiguration.Strategy;
|
|
||||||
import net.sf.ehcache.store.MemoryStoreEvictionPolicy;
|
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
import org.springframework.boot.context.embedded.FilterRegistrationBean;
|
|
||||||
import org.springframework.boot.context.embedded.ServletRegistrationBean;
|
|
||||||
import org.springframework.boot.context.web.SpringBootServletInitializer;
|
import org.springframework.boot.context.web.SpringBootServletInitializer;
|
||||||
import org.springframework.cache.CacheManager;
|
|
||||||
import org.springframework.cache.annotation.CachingConfigurerSupport;
|
|
||||||
import org.springframework.cache.annotation.EnableCaching;
|
|
||||||
import org.springframework.cache.ehcache.EhCacheCacheManager;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
|
|
||||||
import org.springframework.samples.petclinic.model.Vets;
|
|
||||||
import org.springframework.web.servlet.view.xml.MarshallingView;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PetClinic Spring Boot Application.
|
* PetClinic Spring Boot Application.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@SpringBootApplication
|
||||||
@EnableAutoConfiguration
|
|
||||||
@ComponentScan
|
|
||||||
public class PetClinicApplication extends SpringBootServletInitializer {
|
public class PetClinicApplication extends SpringBootServletInitializer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2002-2016 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.springframework.samples.petclinic.config;
|
|
||||||
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
|
|
||||||
import org.springframework.samples.petclinic.model.Vets;
|
|
||||||
import org.springframework.web.servlet.view.BeanNameViewResolver;
|
|
||||||
import org.springframework.web.servlet.view.xml.MarshallingView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* {@link BeanNameViewResolver} is used to resolve the Atom and Xml views. So, the
|
|
||||||
* following beans names must match the name of the JSP you want to override and the
|
|
||||||
* file extension will indicate which bean to use for resolving.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Configuration
|
|
||||||
public class CustomViewsConfiguration {
|
|
||||||
|
|
||||||
@Bean(name = "vets/vetList.xml")
|
|
||||||
public MarshallingView vetsXmlView() {
|
|
||||||
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
|
|
||||||
marshaller.setClassesToBeBound(Vets.class);
|
|
||||||
return new MarshallingView(marshaller);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -18,6 +18,7 @@ package org.springframework.samples.petclinic.web;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.samples.petclinic.model.Vets;
|
import org.springframework.samples.petclinic.model.Vets;
|
||||||
import org.springframework.samples.petclinic.service.ClinicService;
|
import org.springframework.samples.petclinic.service.ClinicService;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
|
@ -41,7 +42,7 @@ public class VetController {
|
||||||
this.clinicService = clinicService;
|
this.clinicService = clinicService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping(value = {"/vets.xml", "/vets.html"})
|
@RequestMapping(value = {"/vets.html"})
|
||||||
public String showVetList(Map<String, Object> model) {
|
public String showVetList(Map<String, Object> model) {
|
||||||
// Here we are returning an object of type 'Vets' rather than a collection of Vet objects
|
// Here we are returning an object of type 'Vets' rather than a collection of Vet objects
|
||||||
// so it is simpler for Object-Xml mapping
|
// so it is simpler for Object-Xml mapping
|
||||||
|
@ -51,7 +52,7 @@ public class VetController {
|
||||||
return "vets/vetList";
|
return "vets/vetList";
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/vets.json")
|
@RequestMapping(value = {"/vets.json", "/vets.xml"})
|
||||||
public
|
public
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
Vets showResourcesVetList() {
|
Vets showResourcesVetList() {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.springframework.samples.petclinic.web;
|
package org.springframework.samples.petclinic.web;
|
||||||
|
|
||||||
|
import org.hamcrest.xml.HasXPath;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
@ -14,6 +15,7 @@ import org.springframework.test.web.servlet.MockMvc;
|
||||||
import org.springframework.test.web.servlet.ResultActions;
|
import org.springframework.test.web.servlet.ResultActions;
|
||||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||||
|
|
||||||
|
import static org.hamcrest.xml.HasXPath.hasXPath;
|
||||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
||||||
|
|
||||||
|
@ -36,14 +38,12 @@ public class VetControllerTests {
|
||||||
this.mockMvc = MockMvcBuilders.standaloneSetup(vetController).build();
|
this.mockMvc = MockMvcBuilders.standaloneSetup(vetController).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testShowVetListXml() throws Exception {
|
|
||||||
testShowVetList("/vets.xml");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testShowVetListHtml() throws Exception {
|
public void testShowVetListHtml() throws Exception {
|
||||||
testShowVetList("/vets.html");
|
mockMvc.perform(get("/vets.html"))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(model().attributeExists("vets"))
|
||||||
|
.andExpect(view().name("vets/vetList"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -54,12 +54,12 @@ public class VetControllerTests {
|
||||||
.andExpect(jsonPath("$.vetList[0].id").value(1));
|
.andExpect(jsonPath("$.vetList[0].id").value(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void testShowVetList(String url) throws Exception {
|
@Test
|
||||||
mockMvc.perform(get(url))
|
public void testShowVetListXml() throws Exception {
|
||||||
|
mockMvc.perform(get("/vets.xml").accept(MediaType.APPLICATION_XML))
|
||||||
.andExpect(status().isOk())
|
.andExpect(status().isOk())
|
||||||
.andExpect(model().attributeExists("vets"))
|
.andExpect(content().contentType(MediaType.APPLICATION_XML_VALUE))
|
||||||
.andExpect(view().name("vets/vetList"));
|
.andExpect(content().node(hasXPath("/vets/vetList[id=1]/id")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue