2017-09-26 5 views
-1

스프링 REST 웹 서비스를 만들기 위해 스프링 부트 (1.5.3)를 사용하고 있습니다. 유일한 의존성으로 spring-boot-starter-web을 추가했습니다 (스프링 가이드 별). 다음으로 내 서비스 클래스에 대한 UserManagementService 인터페이스를 만들었습니다.API 클래스의 REST 웹 서비스 주석 추가

@RequestMapping("/usermanagement/v1") 
public interface UserManagementService { 

    @RequestMapping(value = "/user/{id}/", method=RequestMethod.GET) 
    public UserTo getUserById(@PathVariable("id") long id); 

    @RequestMapping(value = "https://stackoverflow.com/users/", method=RequestMethod.GET) 
    public List<UserTo> getAllUsers(); 
} 

그리고 그 구현 UserManagementServiceImpl

@RestController 
public class UserManagementServiceImpl implements UserManagementService { 

    private Map<Integer, UserTo> users; 

    public UserManagementServiceImpl() { 
     users = new HashMap<>(); 
     users.put(1, new UserTo(1, "Smantha Barnes")); 
     users.put(2, new UserTo(2, "Adam Bukowski")); 
     users.put(3, new UserTo(3, "Meera Nair")); 
    } 

    public UserTo getUserById(long id) { 
     return users.get(id); 
    } 

    public List<UserTo> getAllUsers() { 
     List<UserTo> usersList = new ArrayList<UserTo>(users.values()); 
     return usersList; 
    } 

} 

나는 최소한의 구성으로 봄 부팅을 사용하여 만든 REST 웹 서비스에 원이이 일 거라 생각 했어요. 그러나 웹 서비스에 액세스 할 때 응답 없음이 표시됩니다. 내가 누락 된 것?

또한 필자는 구현 클래스가 아닌 인터페이스에 주석이 추가 된 많은 프로젝트를 보았습니다. 클래스에 주석을다는 것보다 낫다고 생각합니다. 여기가 잘 될거야, 그렇지?

+1

확인해야 할 것입니다. 인스턴스화 된 정확한 클래스가 아니므로 주석이 인터페이스에 의해 올바르게 처리되는지 확신 할 수 없습니다. 그리고 더 의견을 바탕으로 생각할 때, 사용자를 위해 같은 방식으로 서비스를 호출해야합니다. 즉, @RequestMapping (value = "/ users/{id} /", method = RequestMethod.GET)'및'@ RequestMapping (value = "/ users /", method = RequestMethod.GET)'을 사용하여 모든 사용자 또는 사용자 목록의 한 사용자를 원할 수 있습니다. 그러나 코멘트의 두 번째 부분은 당신에게 달렸습니다. – DamCx

+1

@DamCx 다른 시나리오를 시도하고 "@PathVariable"이 인터페이스의 메서드 선언에서 작동하지 않는 것 같습니다. 구현 클래스에서만 작동합니다. 코드의 나머지 주석은 인터페이스에서 제대로 작동합니다. –

답변

0

mentioned in the comments으로 모든 주석이 인터페이스에서 지원되는 것은 아닙니다. 당신이 구현 자체에 그것을 넣어해야하므로 예를 들어 @PathVariable 주석이 작동하지 않습니다 : 그것 또한

public UserTo getUserById(@PathVariable("id") long id) { 
    return users.get(id); 
} 

, 당신은 Map<Integer, UserTo>을 가지고 있지만, 당신은 @PathVariable의를 사용하여 사용자를 검색하고 long을 입력하십시오.

public UserTo getUserById(@PathVariable("id") int id) { 
    return users.get(id); 
} 

그 이유는 1L (long가) 1 (int)과 동일되지 않는 것입니다 : intLongusers의 키 또는 id 매개 변수를 변경하거나, 그래서 이것은 하나가 작동하지 않습니다. 따라서지도 항목을 가져 오면 long 값에 대한 결과가 반환되지 않습니다.