Vraag Hoe u Spring Data-opslagplaatsen en Spring Rest-controllers kunt mengen


Momenteel stel ik enkele Spring Data Repositories bloot als RESTful-services door ze te annoteren met @RepositoryRestResource, zoals dit:

@RepositoryRestResource(collectionResourceRel = "thing1", path = "thing1")
public interface Thing1Repository extends PagingAndSortingRepository<Thing1, String> {}

@RepositoryRestResource(collectionResourceRel = "thing2", path = "thing2")
public interface Thing2Repository extends CrudRepository<Thing2, String> {}

Dit werkt allemaal geweldig. Wanneer je mijn eerste eindpunt raakt, wordt ook alle Spring Data-repositories die ik heb blootgesteld getoond, zoals dit:

{
   _links: {
      thing1: {
         href: "http://localhost:8080/thing1{?page,size,sort}",
         templated: true
      },
      thing2: {
         href: "http://localhost:8080/thing2"
      }
   }
}

Nu heb ik enkele eindpunten die ik wil blootstellen die niet kunnen worden gerepresenteerd door Spring Data Repositories, dus ik gebruik een RestController.

Hier is een eenvoudig voorbeeld:

@RestController
@ExposesResourceFor(Thing3.class)
@RequestMapping("/thing3")
public class Thing3Controller {

  @Autowired 
  EntityLinks entityLinks;

  @Autowired 
  Thing3DAO thing3DAO;

  //just assume Thing3.class extends ResourceSupport. I know this is wrong, but it makes the example shorter  
  @RequestMapping(value = "/{id}", produces = "application/json")
  Thing3 thing3(@PathVariable("id") String id)
  {
      Thing3 thing3 = thing3DAO.findOne(id);         

      Link link = entityLinks.linkToSingleResource(Thing3.class, id);
      thing3.add(link);

      return thing3;
  }
}

Nu als ik deze app voer en ga naar:

http://localhost:8080/thing3/{id} 

Ik krijg wel een JSON-weergave van de Thing3 met een link naar zichzelf, die werkt zoals verwacht.

Wat ik wil bedenken om te doen, is dat het eerste eindpunt ook deze controller beschrijft. Ik wil eigenlijk dit:

{
   _links: {
      thing1: {
         href: "http://localhost:8080/thing1{?page,size,sort}",
         templated: true
      },
      thing2: {
         href: "http://localhost:8080/thing2"
      },
      thing3: {
         href: "http://localhost:8080/thing3"
      }
   }
}

Wat moet ik doen om mijn basis-eindpunt een link naar deze controller te geven?


14
2017-12-09 20:08


oorsprong


antwoorden:


U kunt RepositoryLinkResource overschrijven en een resource toevoegen die naar uw thing3 wijst:

resource.add(ControllerLinkBuilder.linkTo(Thing3Controller.class).withRel("thing3"));

Controleer deze vraag: Aangepast antwoord voor rootverzoek in de lente REST HATEOAS met zowel RepositoryRestResource-s als reguliere controllers


13
2017-12-09 20:17