2017-01-28 2 views
1

모든 요청 매개 변수를 취하고 요청 매개 변수 값을 기반으로 결과를 반환하는 REST GET API를 정의했습니다. 아래처럼 :모든 요청 매개 변수가있는 Java REST API - 모범 사례

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) 
public List<Student> findAll(@RequestParam Map<String, String> allRequestParams) { 
    if(allRequestParams.isEmpty()) { 
     return studentRepository.findAll(); 
    } else { 
     return studentService.findWithFilter(allRequestParams); // This method will take care of using appropriate findBy method on the repository 
    } 
} 

위의 코드는 모든 요청 매개 변수를 검색하는 Spring 방식을 사용하고 있습니다. 대신 HttpServletRequest을 삽입하고 getParametersMap() 메서드를 사용하여 모든 요청 매개 변수를 가져올 수 있습니다. 몇 가지 질문이 있습니다.

  1. 스프링 방식을 사용하거나 getParameterMap()HttpServletRequest에서 사용하는 것이 더 좋습니까?
  2. 코드 검토에서 이런 종류의 프로그래밍이 안티 패턴이라고 들었습니까? 누군가가 왜 안티 패턴으로 간주되는지에 대해 밝힐 수 있습니까? 그리고 그것이 안티 패턴이라면, 이런 종류의 처리를 처리하는 가장 좋은 방법은 무엇입니까? 더 편리하기 때문에
+0

메소드 이름은 거짓말입니다. 필터를 제공하면 모두 찾지 못합니다. 'findAll'은 필터를 받아 들여서는 안됩니다. 그런 필터 처리가 가능한'find'를 원한다면'findById' 나'findByName'과 같은 것을 추가하십시오. – Tom

+0

Thanks @Tom. 합의했으나 이것은 프로덕션 코드가 아니며 여기서 사용 된 명명 규칙을 무시하십시오. – adi

+0

프로그래밍의 종류 ... 주입 httpservletrequest ?? – prashant

답변

1
  1. 봄의 방법은 더 좋다. HttpServletRequest을 대신 사용하려는 유일한 이유는 코드를 비 공급 업체 API에만 연결하려는 경우 일 것입니다. 이미 Spring을 사용하고 있으므로 모든 용도로 사용할 수 있습니다.

    요청 매개 변수를 보유하기 위해 고유 한 개체 사용을 고려할 수 있습니다. 따라서 다른 개발자가 API에서 지원하는 쿼리 매개 변수를 쉽게 볼 수 있습니다. 나는.

    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) 
    public List<Student> findAll(@RequestParam MyQueryObject allRequestParams) { 
        ... 
    } 
    

    MyQueryObject의 필드에 쿼리 매개 변수를 매핑하며, 그 수는 없습니다 경우 클라이언트에 재치있는 오류 메시지를 반환합니다. Spring은 또한 Accept -header를 기반으로하는 오류 메시지의 형식을 기반으로하므로 application/json을 기대하는 클라이언트는이를 가져올 것이고 클라이언트는 text/html이 필요하다고 예상합니다.

  2. 반 패턴이되는 유일한 이유는 약하게 입력된다는 것입니다. Java가 정적 유형을 선호함에 따라 Java에서 안티 패턴이라고 말할 수 있습니다. HttpServletRequest의 이상적 단지 웹 계층에서 사용되어야하기 때문에 더 나은

0

당신의 API 서비스에 HttpServletRequest의를 주입하지. HttpServletRequest가 서비스 객체를 생성하도록 설정되어 있지 않으므로 Spring을 사용하여 기능을 수행하는 데 필요한 데이터를 제공하는 것이 가장 좋은 방법이므로 서비스를 테스트하려는 경우 문자열 맵을 전달할 수 있습니다 테스트하는 동안 유닛 테스팅을위한 HttpServletRequest 객체에 의존하는 대신

+0

그는 기본적으로 당신이 이미 가지고있는 솔루션이'HttpServletRequest'를 주입하고'getParametersMap()'을 호출하는 것보다 낫다고 말하고 있습니다. 주로 'HttpMessageConverter' 레이어 다음에 웹 관련 항목을 사용하지 말아야하기 때문입니다.'@ RequestParam'을 사용한다는 것은 HttpServletRequest''를 모의하지 않고도 Controller 메소드를 테스트 할 수 있음을 의미합니다. –

+0

첫 번째 질문에 대답하고있었습니다. – prashant