2017-10-21 61 views
0

J'ai simple repos de données printemps mise en œuvre de la création d'utilisateur à l'aide Hibernate et MongoDB.création d'entrée renvoie un 201 mais y accéder retourne 404

User.java:

@Data 
@Entity 
@RequiredArgsConstructor 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class User { 

    private @Id String username; 

    private String about; 
} 

UserRepository.java

@PreAuthorize("hasRole('ROLE_USER')") 
@CrossOrigin(methods = {GET, PUT, POST}) 
public interface UserRepository extends MongoRepository<User, String> { 

    @Override 
    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    <S extends User> S save(S s); 
} 

Ensuite, je fais un appel POST à ​​/users avec ce corps:

{ 
    "username": "username1", 
    "about": "example" 
} 

Je reçois un 201 Created réponse du corps suivant:

{ 
    "about": "example", 
    "_links": { 
     "self": { 
      "href": "http://localhost:8080/api/users/username1" 
     }, 
     "user": { 
      "href": "http://localhost:8080/api/users/username1" 
     } 
    } 
} 

Je fais une GET demande /users pour voir si l'utilisateur a en effet été ajouté et cette réponse est renvoyée à juste titre:

{ 
    "_embedded": { 
     "users": [ 
      { 
       "about": "example", 
       "_links": { 
        "self": { 
         "href": "http://localhost:8080/api/users/username1" 
        }, 
        "user": { 
         "href": "http://localhost:8080/api/users/username1" 
        } 
       } 
      } 
     ] 
    }, 
    "_links": { 
     "self": { 
      "href": "http://localhost:8080/api/users{?page,size,sort}", 
      "templated": true 
     }, 
     "profile": { 
      "href": "http://localhost:8080/api/profile/users" 
     } 
    }, 
    "page": { 
     "size": 20, 
     "totalElements": 1, 
     "totalPages": 1, 
     "number": 0 
    } 
} 

LE PROBLÈME

Mais alors j'accède à l'URL de l'utilisateur fourni dans les liens, à savoir, http://localhost:8080/api/users/username1 mais j'obtiens une réponse 404 Not Found.

Qu'est-ce que je fais mal? J'ai essayé de regarder des exemples et de la documentation mais rien ne semble faire le travail. Si j'ajoute l'annotation @AutoGenerated cela fonctionne, mais je veux évidemment que le id soit fourni par la requête en tant que username.

Répondre

0

En User.java, j'ai changé la déclaration de username à ceci:

@Id 
@JsonProperty("username") 
@NotBlank 
private String id; 

MongoDB nécessite _id comme la clé primaire pour chaque document par défaut sinon il ne sera pas indexé. J'ai dû changer le nom de champ en id pour qu'il se traduise par _id sur MongoDB avec l'annotation @Id. Pour résoudre ce problème du côté du consommateur, j'ai utilisé @JsonProperty("username") pour obtenir la valeur de la propriété username du corps JSON de la demande.