MVC設定(9):WebMvcConfigure-HSTPメッセージ変換器+JSON,XML


12.HTTPメッセージ変換器


HTTPメッセージ変換器
  • 要求本文からメッセージ(@RequestBody)を取得するか、本文に応答してメッセージを作成するときに使用します(@ResponseBody).
  • @RestController
    public class SampleController {
    
        @GetMapping("/message")
        public @ResponseBody String message(@RequestBody String body){
            return body;
        }
    }
    テストの作成
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class SampleControllerTest {
    
        @Autowired
        MockMvc mockMvc;
    
        @Test
        public void stringmessage() throws Exception{
            this.mockMvc.perform(get("/message")
                .content("hello"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string("hello"));
        }
    }
    デフォルトHTTPメッセージ変換器
  • バイトアレイ変換器
  • 文字列変換器
  • リソース変換器
  • Formコンバータ(フォームデータから/多値マッピング)
  • ここからは、classpathにしか登録されていません.
  • (JAXB 2コンバータ)
  • (Jackson 2コンバータ)
  • (Jackson Converter)
  • (Gsonコンバータ)
  • (Atom Converter)
  • (RSSコンバータ)
  • ...
  • どのようなメッセージ変換器を書くかは、リクエストヘッダのContent-Type、accpetに依存します.
    ConfigureConverterという名前の方法でWebMcConfigureにメッセージ変換器を追加することもできますが、この方法でメッセージ変換器を追加すると、デフォルトの変換器は使用できません.したがって、追加したい場合はextendMessageConvertsというメソッドを使用できます.
    設定方法
    デフォルトで登録されているコンバータに新しいコンバータを追加:extendMessageConverter デフォルトで登録されているすべてのコンバータを無視して、新しいコンバータを設定します.メッセージコンバータを構成します.
  • 依存性を得るために他のコンバータを登録します(推奨)
    -依存性をmavenまたはグラデーション設定に追加すると、対応するコンバータが自動的に登録されます.
  • WebMvcConfigurationSupport
    -(この機能自体はSpring BootではなくSpringフレームワークの機能です.)
  • 13.HTTPメッセージ変換器JSON


    スプリングガイドを無効にする場合(W e b M v c C o n f igrationSupport)
    使用したいJSONライブラリを依存項目として追加
  • GSON
  • JacksonJSON
  • JacksonJSON 2
  • スプリングガイドを使用する場合:
  • 基本的にJacksonJSON 2は依存性に属する.
  • デフォルト登録
  • 、すなわちJSONのHTTPメッセージ変換器.

  • ドメインクラス
    @Entity
    public class Person {
    
        @Id @GeneratedValue
        private Long id;
    
        private String name;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    コントローラクラス
    @RestController
    public class SampleController {
    
        @GetMapping("/jsonMessage")
        public Person jsonMessage(@RequestBody Person person){
            return person;
        }
    }
    テストコード
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class SampleControllerTest {
    
        @Autowired
        MockMvc mockMvc;
    
        @Autowired
        PersonRepository personRepository;
    
        @Autowired
        ObjectMapper objectMapper;
    
        @Test
        public void jsonMessage() throws Exception {
            Person person = new Person();
            person.setId(2019l);
            person.setName("spring");
    
            String jsonString = objectMapper.writeValueAsString(person);
    
            this.mockMvc.perform(get("/jsonMessage")
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .content(jsonString)
                    .accept(MediaType.APPLICATION_JSON_UTF8))
                    .andDo(print())
                    .andExpect(status().isOk())
                    .andExpect(jsonPath("$.id").value(2019))
                    .andExpect(jsonPath("$.name").value("spring"));
        }
    }
    JSONパスは、json応答の本文を表示するときに使用できます.
    あるいはpostmanというクライアント起動サーバでテストすることもできます.

    14.HTTPメッセージ変換器XML


    オブジェクトXML Mapper(OXM)ライブラリにスプリングサポートの依存項目を追加
  • JacksonXML
  • JAXB
  • スプリングガイドを使用する場合:
  • デフォルトではXML依存性は追加されません.
  • WebMvcConfiguratorでBeanを使用してJAXB 2 Marshallerメッセージ変換器
  • を登録する
  • pom.JAXB依存性をxmlに
  • 追加
    <dependency> 
    	<groupId>javax.xml.bind</groupId> 
    	<artifactId>jaxb-api</artifactId> 
    </dependency> 
    <dependency> 
    	<groupId>org.glassfish.jaxb</groupId> 
    	<artifactId>jaxb-runtime</artifactId> 
    </dependency> 
    <dependency> 
    	<groupId>org.springframework</groupId> 
    	<artifactId>spring-oxm</artifactId> 
    	<version>${spring-framework.version}</version> 
    </dependency>
  • WebMvcConfiguratorでBeanを使用してJAXB 2 Marshallerメッセージ変換器
  • を登録する
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Bean
        public Jaxb2Marshaller jaxb2Marshaller(){
            Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
            jaxb2Marshaller.setPackagesToScan(Person.class.getPackageName());
            // Person.class가 있는 패키지 이름을 scan해서 
            // @XmlRootElement 애노테이션이 있는지 확인
            return jaxb2Marshaller;
        }
    }
  • ドメインクラスに@XmlRootElementプレゼンテーション
  • を追加
    @XmlRootElement
    @Entity
    public class Person {
    
        @Id @GeneratedValue
        private Long id;
    
        private String name;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
  • テストコード
  • @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class SampleControllerTest {
    
        @Autowired
        MockMvc mockMvc;
    
        @Autowired
        PersonRepository personRepository;
    
        @Autowired
        Marshaller marshaller;
    
        @Test
        public void xmlMessage() throws Exception {
            Person person = new Person();
            person.setId(2019l);
            person.setName("spring");
    
            StringWriter stringWriter = new StringWriter();
            Result result = new StreamResult(stringWriter);
            marshaller.marshal(person, result);
            String xmlString = stringWriter.toString();
    
            this.mockMvc.perform(get("/jsonMessage")
                    .contentType(MediaType.APPLICATION_XML)
                    .content(xmlString)
                    .accept(MediaType.APPLICATION_XML))
                    .andDo(print())
                    .andExpect(status().isOk())
                    .andExpect(xpath("person/name").string("seonju"))
                    .andExpect(xpath("person/id").string("2019"));
        }
    }
    xml応答の本文を表示する場合は、Xpathを使用します.
    同様にpostmanというクライアント起動サーバでテストすることもできます.
    リファレンス
  • インフラストラクチャ:SpringWeb MVC(白旗船)
  • https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html#configureMessageConverters-java.util.List
  • https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html#extendMessageConverters-java.util.List
  • https://www.baeldung.com/spring-httpmessageconverter-rest
  • https://github.com/json-path/JsonPath
  • http://jsonpath.com/
  • https://www.w3schools.com/xml/xpath_syntax.asp
  • https://www.freeformatter.com/xpath-tester.html