2017-06-14 82 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但文章沒有返回這個HttpMediaTypeNotSupportedException。我試圖在請求和控制器中添加和刪除接受和內容類型的頭文件,這似乎不起作用。

此問題似乎與Spring integration test with mockmvc throws org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json' not supported有關,但在本例中刪除TestConfiguration中的excludeFilters不允許Spring解釋上下文。另外,我不確定Karl R的意思是「在我的類路徑中包含serverruntime」。

任何幫助表示讚賞。

回答

1

我認爲你應該添加@EnableWebMvc到你的TestConfiguration。

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