2016-04-25 9 views
1

Ich benutze MongoRepository im Frühjahr Boot-Daten Rest und es funktioniert gut, ohne meine eigenen Controller zu implementieren. Aber ich möchte "Registrierungsdatum" in meine neu erstellten Objekte setzen und die Standardimplementierung unterstützt das nicht. Ich muss meinen eigenen benutzerdefinierten Controller implementieren, um zusätzliche Felder in jedem neuen Objekt zu platzieren. Das Problem ist, dass HATEOAS nicht mehr funktioniert, wenn ich meinen eigenen Controller implementiere.Spring Boot Data REST, HATEOAS funktioniert nicht mit einem benutzerdefinierten Controller

Repository Klasse:

@RepositoryRestResource(collectionResourceRel = "users", path = "users") 
public interface UserRepository extends MongoRepository<User, String> { 
} 

Controller-Klasse:

@RestController 
@RequestMapping("/users") 
public class UserController { 

    @Autowired 
    UserRepository repository; 

    @RequestMapping(method = RequestMethod.GET) 
    public ResponseEntity<List<User>> getAll() { 
     List<User> list = repository.findAll(); 
     return new ResponseEntity<>(list, HttpStatus.OK); 
    } 

Payload mit diesem kundenspezifischen Controller sieht wie folgt aus:

[ 
    { 
     "id": "571de80ebdabf25dd6cdfb73", 
     "username": "mark", 
     "password": "mark123", 
     "email": "[email protected]", 
     "createdAt": "2016-04-25 11:49" 
    }, 
    { 
     ... 

Payload ohne meine benutzerdefinierte Controller wie folgt aussieht:

{ 
    "_embedded": { 
     "users": [ 
      { 
       "username": "mark", 
       "password": "mark123", 
       "email": "[email protected]", 
       "createdAt": "2016-04-25 11:49", 
       "_links": { 
        "self": { 
         "href": "http://localhost:8080/users/571de80ebdabf25dd6cdfb73" 
        }, 
        "user": { 
         "href": "http://localhost:8080/users/571de80ebdabf25dd6cdfb73" 
        } 
       } 
      }, 
      { 
      ..... 

Ich habe versucht, @RepositoryRestController anstelle von @RestController zu verwenden, aber es hat nicht geholfen. Ich frage mich, ob es eine andere Möglichkeit gibt, "Registerdatum" in neu erstellte Objekte zu setzen, ohne einen eigenen benutzerdefinierten Controller zu implementieren? Wenn nicht, was kann ich HATEOAS tun, um wieder zu arbeiten?

+0

Sie geben den gleichen Pfad Controller und Repository Ruhe Quelle Ad nur fügen Sie spezifische Pfad in Ihrem benutzerdefinierten Controller Beispiel ersetzen Sie Ihre getAll() m ethod Anfrage Zuordnung mit diesem @ RequestMapping (Methode = RequestMethod.GET, Wert = "/ getall") und versuchen Sie nach –

+0

@Kakashihatake danke für den Vorschlag, aber es funktioniert nicht. Das Ergebnis ist das gleiche wie zuvor. – oxyt

+0

hast du eine Anfrage mit diesem Pfad/people/getall? –

Antwort

0

ich mein Problem dank Kommentare gelöst, die mir eine Perspektive :) gab

1 - Extended User-Klasse mit ResourceSupport. (Anmerkung:. Verwenden Sie nicht nur id für userId weil ResourceSupport getId() Methode benötigt)

public class User extends ResourceSupport { 

    @Id 
    private String userId; 

2 - Aktualisiert meine Controller-Klasse als

gefolgt
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; 

@RequestMapping(method = RequestMethod.GET) 
    public ResponseEntity<List<User>> getAll() { 
     List<User> list = repository.findAll(); 
     for(User user : list) { 
      Link self = linkTo(UserController.class).slash(user.getUserId()).withSelfRel(); 
      Link users = linkTo(UserController.class).slash(user.getId()).withRel("users"); 
      user.add(self); 
      user.add(users); 
     } 
     return new ResponseEntity<>(list, HttpStatus.OK); 
    } 

Nun schauen meine Nutzlasten wie folgt aus:

[ 
    { 
     "userId": "571e44ecbdab7b1ffc668f02", 
     "username": "newton", 
     "password": "gravity", 
     "email": "[email protected]", 
     "createdAt": "2016-04-25 18: 
     "links": [ 
      { 
       "rel": "self", 
       "href": "http://localhost:8080/users/571e44ecbdab7b1ffc668f02" 
      }, 
      { 
       "rel": "users", 
       "href": "http://localhost:8080/users" 
      } 
     ] 
    }, 
    { 
     .... 
+1

Hat immer noch signifikante Unterschiede mit der HATEOAS Antwort von der Repo ... haben Sie zusätzliche Informationen dazu? – Rafael