2017-09-26 3 views
-1

J'utilise Spring Boot (1.5.3) pour créer un service Web Spring REST. J'ai ajouté spring-boot-starter-web comme seule dépendance (selon le guide de printemps). Ensuite, j'ai créé l'interface UserManagementService pour ma classe de service.Ajout d'une annotation de service Web REST dans la classe API

@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(); 
} 

et sa mise en œuvre 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; 
    } 

} 

Je voulais créer un service Web REST à l'aide de démarrage Spring avec la configuration minimale et je pensais que cela fonctionnerait. Mais en accédant à mon service Web, je reçois aucune réponse. Qu'est-ce qui me manque?

En outre, j'ai vu beaucoup de projets où des annotations sont ajoutées à l'interface plutôt qu'à la classe d'implémentation. Ce que je pense est mieux que des classes d'annotation. Ça devrait marcher ici, pas vrai?

+1

Vous devrez vérifier, mais je ne suis pas sûr que les annotations soient correctement gérées par les interfaces, car ce n'est pas la classe exacte qui est instanciée. Et sur une pensée plus basée sur l'opinion, vous devriez appeler vos services pour les utilisateurs de la même manière: ce que je veux dire est '@RequestMapping (value ="/users/{id}/", méthode = RequestMethod.GET)' et '@ RequestMapping (value = "/ users /", method = RequestMethod.GET) 'comme vous voulez tous les utilisateurs ou un utilisateur de la liste des utilisateurs. Mais la deuxième partie du commentaire est à vous. – DamCx

+1

@DamCx J'ai essayé différents scénarios et "@PathVariable" ne semble pas fonctionner dans la déclaration de méthode dans l'interface. Cela fonctionne uniquement dans la classe d'implémentation. Le reste des annotations dans le code fonctionnent correctement dans l'interface. –

Répondre

0

En tant que mentioned in the comments, toutes les annotations ne sont pas prises en charge sur les interfaces. L'annotation @PathVariable par exemple ne fonctionne pas, vous devrez mettre cela sur la mise en œuvre elle-même:

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

En plus de cela, vous avez un Map<Integer, UserTo>, mais vous récupérez les utilisateurs en utilisant un @PathVariable de tapez long. Cela ne fonctionnera pas non plus, donc soit modifier la clé de users à Long ou le paramètre id à int:

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

La raison est que 1L (long) n'est pas la même chose que 1 (int). Ainsi, la récupération d'une entrée de mappage ne retournera aucun résultat pour une valeur long.