簡體   English   中英

406 HttpMediaTypeNotAcceptableException:找不到“文本/日歷”類型輸出的可接受表示形式

[英]406 HttpMediaTypeNotAcceptableException: Could not find acceptable representation for “text/calendar” type output

我正在嘗試通過Spring Boot提供ICS文件。 我無法使用正確的Content-Type進行響應(我在Junit中)。 我認為構建正確的響應,但Spring會覆蓋它。

在我的@RestController中,我有這個

@GetMapping(value="/meeting/ics/{id}",produces = "text/calendar;charset=UTF-8")
public ResponseEntity<byte[]> getMeetingRoomCalendar(@PathVariable("id") Long id) throws ParseException, URISyntaxException, IOException {
    //...

    byte[]out= calendar.toString().getBytes();

    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(new MediaType("text", "calendar", Charset.forName("UTF-8")));
    responseHeaders.setContentLength(out.length);

    return new ResponseEntity<>(out,responseHeaders,HttpStatus.OK);
}

我這樣測試:

MvcResult mvcResult = restMembershipConfigMockMvc.perform(get("/api/meeting/ics/1")
        .accept(MediaType.ALL))
        .andExpect(status().isOk())
        .andReturn()
        ;

我嘗試了在堆棧溢出中類似問題上HttpMediaTypeNotAcceptableException: Could not find acceptable representation響應,但是我始終會收到406狀態,並拋出HttpMediaTypeNotAcceptableException: Could not find acceptable representation響應

在這里,我從路徑后綴中刪除了“ .ics”,以排除它,從而導致異常。

好的,我找到了路。 我的問題有太多錯誤點。 它不起作用的原因是因為Spring mvc不提供支持類型“ text / calendar”的HttpMessageConverter

因此,我創建了一個(我使用ical4j庫,因此我希望我的控制器響應這種對象):

public class ICSHttpMessageConverter<T> extends AbstractHttpMessageConverter<T>
{

    public ICSHttpMessageConverter() {
        super(new MediaType("text","calendar"));
    }

    @Override
    protected boolean supports(Class<?> aClass) {
        return true;
    }


    @Override
    protected T readInternal(Class<? extends T> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
        CalendarBuilder calendarBuilder = new CalendarBuilder();
        Calendar calendar = null;
        try {
             calendar = calendarBuilder.build(httpInputMessage.getBody());

        } catch (ParserException e) {
            e.printStackTrace();
        }
        return (T)calendar;
    }

    @Override
    protected void writeInternal(T t, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
        httpOutputMessage.getBody().write(t.toString().getBytes());
    }
}

我可能應該改進支持方法,但是到那時一切都正常了,我很樂意參加其他任務。

現在我們只是在Spring配置中注冊了轉換器:

@Configuration
public class MediaTypeConfiguration extends WebMvcConfigurationSupport {

    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters){
        converters.add(new ICSHttpMessageConverter());
        super.addDefaultHttpMessageConverters(converters);
    }
}

之后,我的控制器如下所示:

@GetMapping(value="/meeting/ics/{id}.ics")
public ResponseEntity<Calendar> getMeetingRoomCalendar(@PathVariable("id") Long id) throws ParseException, URISyntaxException, IOException {
    //...
    calendar = ICSMeetingRoomAgendaHandler.loadBookings(calendar,bookingDTOS,meetingRoomDTO);

    return ResponseEntity.ok().body(calendar);
}

那時,我唯一的問題是,在我的junit集成測試中,我的轉換器似乎沒有被注冊。 這是因為在模擬init時沒有給我的MockMvc轉換器。 我只需要用setMessageConverters方法添加它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM