본문 바로가기
공부할 것 !

[오류] 415 (Unsupported Media Type)

by sejin2 2024. 9. 23.

문제가 되는 부분

/* 삭제 */ 
$('button[data-action="deleteList"]').on('click', function() { 
    var selectedCrsCdList = $('.item-checkbox:checked').map(function() {
        return { crsCd: $(this).val() }; 
    }).get();

    if (selectedCrsCdList.length === 0) {
        alert("삭제할 항목이 없습니다.");
        return;
    } 
    ajaxRequest2('/deleteCrs', 'POST', JSON.stringify({ selectedCrsCdList: selectedCrsCdList }), function(data) {
        alert("삭제 완료 !");
        appendTbody($('#list table'), data);
    }); 
});

 

삭제 버튼을 누르면 계속 415 (Unsupported Media Type) 오류가 발생했다. 

ajaxRequest2에서도 분명히 content-type을 아래와 같이

contentType: 'application/json; charset=UTF-8',

 

잘 설정했는데도 계속 같은 오류가 발생했다.

해당 오류에 대해 여기 저기 찾아보니  @RequestBody 설정 문제이거나, Jackson 라이브러리 의존성 문제라고하는데, 

나는  @RequestBody도 잘 되어있고, Jackson 라이브러리도 pom.xml에 있었다.

그런데도 자꾸 같은 오류가 발생해 컨트롤러에도 method와 consumes를 추가해주었다.

@RequestMapping(value = "/deleteCrs", method = RequestMethod.POST, consumes = "application/json")
public @ResponseBody String deleteList(@RequestBody Map<String, List<SelectVo>> requestBody, SelectVo vo) throws Exception {

   List<SelectVo> list = requestBody.get("selectedCrsCdList"); 

    cou1100eService.deleteList(list); 
    List<SelectVo> selectList = cou1100eService.getSelectList(vo); 

    return objectMapper.writeValueAsString(selectList);
}

 

그런데도 계속 같은 오류가 발생했다....

 

또 다시 찾아보던 중 spring-servlet.xml 에 <mvc:annotation-driven/> 태그를 추가해야한다는 것을 발견했다.

해당 태그는 spring MVC에서 어노테이션 기반의 웹 애플리케이션을 설정하는 것으로

주로 @Controller, @RequestMapping, @ResponseBody, @RestController와 같은 어노테이션을 사용할 수 있도록 지원한다고 한다.

<context:component-scan>으로 컨트롤러 및 서비스 클래스를 자동으로 등록하고,

<mvc:annotation-driven/>으로 MVC 기능을 활성화해야 한다.

<mvc:annotation-driven/>을 사용하면 내부에서 자동으로 RequestMappingHandlerMapping 과 RequestMappingHandlerAdapter를 구성해주어 Handler 역할을 쉽게 구현시켜준다. 

더보기
HandlerMapping : HTTP 요청 정보를 이용해서 컨트롤러를 찾아주는 기능으로 요청 URL을 보고 어떤 Controller가 처리할지 결정
HandlerAdapter : HandlerMapping을 통해 찾은 컨트롤러를 직접 실행하는 기능을 수행

 

그래서 spring-servlet.xml에 해당 태그를 넣어주고 다시 시도해봤더니 이번에는 415 오류가 아닌 아래와 같은 서버 오류가 발생했다.

 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean#0': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException

 

gpt에 물어보니 해당오류는 Java 9 이상에서 발생할 수 있으며, javax.xml.bind 패키지가 기본 JDK에서 제거되었기 때문에 발생한다고 한다. 이를 해결하기 위해서는 JAXB API를 명시적으로 의존성으로 추가해야 한다고 한다.

그래서 mvn repository에서 아래와 같이 의존성을 추가해주었다.

<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>${jaxb.version}</version>
        </dependency>
       
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
           <version>${jaxb.version}</version>
        </dependency>

 

그리고 다시 해보니 잘 삭제되는 것을 확인할 수 있었다.

'공부할 것 !' 카테고리의 다른 글

Entity <-> DTO 변환  (1) 2025.02.05
[오류] java.lang.IllegalStateException  (0) 2024.09.20
chart.js를 이용해 데이터 시각화하기  (0) 2024.08.23
AOP  (0) 2024.08.22
Maven, 형상관리  (0) 2024.08.20