2017-06-14 12 views
4

をサポートしていない、私は次の例外を受け取ります。MockMvc HttpMediaTypeNotSupportedException:コンテンツタイプ 'アプリケーション/ JSONは'

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json' not supported 

    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.readWithMessageConverters(HandlerMethodInvoker.java:653) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestBody(HandlerMethodInvoker.java:612) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:361) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) 
    at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) 

私のテストは、次のようになります。

public class AvailabilityControllerTest extends BaseTest { 
    @Test 
    public void createAvailability() throws Exception { 
     final String createAvailabilityEndPoint = "/api/v4/companies/123/availabilities"; 
     final String responseName = "availabilityResponseDTO"; 

     AvailabilityDTO availabilityDTO = new AvailabilityDTO(); 

     MvcResult mvcResult = mockMvc.perform(
       MockMvcRequestBuilders.post(createAvailabilityEndPoint) 
         .contentType(MediaType.APPLICATION_JSON_VALUE) 
         .accept(MediaType.APPLICATION_JSON_VALUE) 
         .content(new ObjectMapper().writeValueAsString(availabilityDTO))) 
       .andExpect(MockMvcResultMatchers.status().isCreated()) 
       .andReturn(); 
    } 

BaseTestと同じように:

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = TestConfiguration.class) 
@AutoConfigureMockMvc 
public class BaseTest { 

    @Autowired 
    protected MockMvc mockMvc; 

} 

TestConfigurationは次のようになります。

@Configuration 
@ComponentScan(
     basePackages = "com.app", 
     excludeFilters = { 
       @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = App.class) 
     } 
) 
public class TestConfiguration { 

    @Bean 
    public ErrorAttributes errorAttributes() { 
     return new DefaultErrorAttributes(); 
    } 
} 

AvailabilityControllerは次のようになります。

@RestController 
@RequestMapping("/api/v4/companies") 
public class AvailabilityController { 

    public static final String ACCEPT_APP_JSON = "Accept=" + AcceptableMediaType.APPLICATION_JSON; 

    @Autowired 
    private AvailabilityFacade availabilityFacade; 

@RequestMapping(value = "/{companyId}/employees/{employeeId}/availabilities", method = RequestMethod.GET) 
    public List<AvailabilityEventResponseDTO> getUserAvailabilities(@PathVariable String companyId, 
                    @PathVariable String employeeId) { 
     return availabilityFacade.getUserAvailabilities(employeeId); 
    } 

    @RequestMapping(value = "/{companyId}/availabilities", method = RequestMethod.POST, headers = ACCEPT_APP_JSON, consumes = MediaType.APPLICATION_JSON_VALUE) 
    public ResponseEntity<AvailabilityResponseDTO> createAvailability(@PathVariable String companyId, 
                     @Valid @RequestBody AvailabilityDTO availabilityDTO) { 
     return new ResponseEntity<>(
       availabilityFacade.createAvailability(companyId, availabilityDTO), 
       HttpStatus.CREATED 
     ); 
    } 
} 

基本的にはGETリクエストがMockMvcで動作しますが、POSTがないと、このHttpMediaTypeNotSupportedExceptionを返します。私は要求とコントローラの両方で受け入れとコンテンツタイプのヘッダを追加したり削除したりしようとしましたが、これはうまくいかないようです。

この問題はSpring integration test with mockmvc throws org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json' not supportedと関連しているようですが、この場合TestConfigurationのexcludeFiltersを削除しても、Springがコンテキストを解釈することはできません。また、私はKarl Rが "クラスパス上にサーバーランタイムを含める"ことを意味するかどうかはわかりません。

何か助けていただければ幸いです。

答えて

1

@EnableWebMvcをTestConfigurationに追加する必要があると思います。

@Configuration 
@ComponentScan(
    basePackages = "com.app", 
    excludeFilters = { 
      @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, 
       classes = App.class) 
    } 
) 
@EnableWebMvc 
public class TestConfiguration { 
関連する問題