실행은 되는데 ajax 404 에러가 날때

HiroPark·2022년 10월 2일
0

문제해결

목록 보기
3/11

컨트롤러

    @PostMapping("/alerts/save")
    public void AlertSave(@RequestBody alertSaveDto alertSaveDto) {
         alertService.save(alertSaveDto);
    }

서비스

    public void save(@NotNull alertSaveDto alertSaveDto) {
        User user = userDetailService.returnUser();
        alertSaveDto.setUser(user);

        alertRepository.save(alertSaveDto.toEntity());
    }

index.js

alertSave : function () {
        var data = {
            price : $('#price').val(),
            percentage : $('#percentage').val()
        };

        $.ajax({
                    type: 'POST',
                    url: '/alerts/save',
                    dataType: 'json',
                    contentType:'application/json; charset=utf-8',
                    data: JSON.stringify(data)
                }).done(function() {
                    alert('알림이 등록되었습니다.');
                    window.location.href = '/alerts'; // 글 등록이 성공하면 메인페이지로 이동
                }).fail(function (error) {
                    alert(JSON.stringify(error) + '이에러인가');
                });
    },

저장 기능이 동작은 하는데, 계속 브라우저에서 404 에러가 발생합니다.

에러 로그를 확인하니 ajax 부분에서 에러가 납니다.

디버깅 하는 습관을 기르려고 디버거를 열심히 사용하며 에러를 고치고 있는데.. 이부분은 디버깅 하는 방법을 제가 모르는건지, 중단점을 찍어봐야 통으로 넘어가고 디버깅이 제대로 이뤄지지가 않습니다.

검색을 통해 이 문제는 서버에서 아무것도 응답하지 않기 때문이라는 것을 알게됐습니다.

굳이 서버에서 무언가를 응답해 줄 필요가 있나? 싶어서 void로 아무것도 리턴하지 않게 만들었는데 그게 문제였습니다.

컨트롤러는 ajax 요청을 받아서 처리를 하고 이에대한 결과를 리턴해야 하지만, 이 응답값이 없어서 에러가 난 것이었습니다.

현재 jquery의 $.ajax 메소드를 사용하여 ajax요청을 날리고 있으니, 이에 대한 응답값만 마련해주면 되겠죠?

리턴타입을 long으로 바꾸고, 저장한 값의 id를 리턴해줍니다.

return alertRepository.save(alertSaveDto.toEntity()).getId();

java.lang.IllegalArgumentException: Unknown return value type: java.lang.long

안됩니다 ㅎㅎ

검색해보니 @ResponseBody 를 추가해주지 않아서 나는 에러라고 하니, 이를 추가해줍니다. 이제 의도했던데로 작동하는데...뭐가 달라진걸까요?

  • @ResponseBody 애노테이션 없이는 스프링은 리턴값을 view의 이름으로 받아들입니다.
    return "index"; 로 index.mustache를 리턴하듯 말이죠. 그러나 이 뷰의 이름이 long 타입이 될수는 없겠죠... 그래서 에러가 난것입니다.

    Annotation that indicates a method return value should be bound to the web response body. Supported for annotated handler methods.

리턴값이 뷰 이름이 아닌 responsebody에 귀속된다는 것을 알리는 애노테이션이라고 생각하면 될 것같습니다.

수정 후 코드는 다음과 같습니다.

    @PostMapping("/alerts/save")
    @ResponseBody
    public long AlertSave(@RequestBody alertSaveDto alertSaveDto) {
        return alertService.save(alertSaveDto);
    }
    public long save(@NotNull alertSaveDto alertSaveDto) {
        User user = userDetailService.returnUser();
        alertSaveDto.setUser(user);

        return alertRepository.save(alertSaveDto.toEntity()).getId();
    }

참고

https://superdev.tistory.com/30
https://yejipro.tistory.com/entry/javalangIllegalArgumentException-Unknown-return-value-type-javalangBoolean
https://noritersand.github.io/servlet/servlet-ajax-%EC%9A%94%EC%B2%AD-%EC%B2%98%EB%A6%AC%EA%B0%80-%EC%99%84%EB%A3%8C%EB%90%98%EC%97%88%EB%8A%94%EB%8D%B0%EB%8F%84-404%EC%97%90%EB%9F%AC%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%A0-%EB%95%8C/
https://stackoverflow.com/questions/27179875/http-status-500-illegalargumentexception-unknown-return-value-type-when-i

profile
https://de-vlog.tistory.com/ 이사중입니다

0개의 댓글