Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RequestBody가 값이 하나인 json을 객체로 직렬화하지 못하는 문제 #15

Closed
ashlovesliitea opened this issue Mar 29, 2022 · 2 comments
Labels
bug Something isn't working

Comments

@ashlovesliitea
Copy link
Collaborator

ashlovesliitea commented Mar 29, 2022

Context : Json이 Body에 담긴 request를 보내 멤버변수가 하나인 객체를 RequestBody로 받으려 했다.

@RequiredArgsConstructor
@Getter
@Setter
public class PostMenuCategoryReq {
    private String menu_category_name;
}
    @NoAuth
    @ResponseBody
    @PostMapping("/{storeIdx}/menu-category")
    public BaseResponse<String> createMenuCategory(@PathVariable("storeIdx") int store_idx
            @RequestBody PostMenuCategoryReq postMenuCategoryReq){

Error occured : Json request에 값을 하나만 포함해서 보냈을 때 객체로 제대로 직렬화가 안되는 문제가 발생하며, 오류는 다음과 같다.

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `com.example.demo.src.store.model.request.PostMenuCategoryReq` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.example.demo.src.store.model.request.PostMenuCategoryReq` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (PushbackInputStream); line: 2, column: 5] 

그러나

  1. 파싱하고자 하는 객체 클래스의 멤버 변수가 2개 이상 일때
  2. 객체 클래스의 생성자 어노테이션을 @AllArgsConstructor -> @requiredargsconstructor 로 변경시에는 문제가 발생하지 않는다.

원인을 알아볼것!

@ashlovesliitea ashlovesliitea added the bug Something isn't working label Mar 29, 2022
@ashlovesliitea
Copy link
Collaborator Author

Allow handling of single-arg constructor as property based by default

Jackson library에서 제기된 이슈를 확인하면, 현재 Jackson library에서 single-argument constructor로 된 객체의 파싱을 지원하고 있지 않은 듯 하다.

@ashlovesliitea
Copy link
Collaborator Author

jackson-extension library

  • 따라서 해결 방법은
    • jackson library의 확장 버전을 사용하던지
    • 객체에 임의의 멤버 변수라도 추가를 하거나, json에 포함된 데이터가 오직 하나인 body를 보내고 있다면 그것만 파싱하려고 objectmapper를 사용하는 것 또한 자원을 소모하는 것이기 때문에 Path Variable이나, Query Parameter로 보내버리자.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant