public Long getId() { return this.employee.getId() .orElseThrow(() -> new RuntimeException("Couldn't find anything.")); }
public String getManager() { return this.employee.getManager().getName(); }
@PutMapping("/employees/{id}") ResponseEntity<?> updateEmployee(@RequestBody Employee employee, @PathVariable long id) { Employee employeeToUpdate = employee; employeeToUpdate.setId(id); Employee updatedEmployee = repository.save(employeeToUpdate); return new Resource<>(updatedEmployee, linkTo(methodOn(EmployeeController.class).findOne(updatedEmployee.getId())).withSelfRel() .andAffordance(afford(methodOn(EmployeeController.class).updateEmployee(null, updatedEmployee.getId()))) .andAffordance(afford(methodOn(EmployeeController.class).deleteEmployee(updatedEmployee.getId()))), linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees") ).getId() .map(Link::getHref) .map(href -> { try { return new URI(href); } catch (URISyntaxException e) { throw new RuntimeException(e); } }) .map(uri -> ResponseEntity.noContent().location(uri).build()) .orElse(ResponseEntity.badRequest().body("Unable to update " + employeeToUpdate)); }
/** * Update existing employee then return a Location header. * * @param employee * @param id * @return */ @PutMapping("/employees/{id}") ResponseEntity<?> updateEmployee(@RequestBody Employee employee, @PathVariable long id) { Employee employeeToUpdate = employee; employeeToUpdate.setId(id); repository.save(employeeToUpdate); Link newlyCreatedLink = linkTo(methodOn(EmployeeController.class).findOne(id)).withSelfRel(); try { return ResponseEntity.noContent() .location(new URI(newlyCreatedLink.getHref())) .build(); } catch (URISyntaxException e) { return ResponseEntity.badRequest().body("Unable to update " + employeeToUpdate); } }
public String getName() { return this.employee.getName(); }
@PostMapping("/employees") public ResponseEntity<Resource<Employee>> newEmployee(@RequestBody Employee employee) { Employee savedEmployee = repository.save(employee); return ResponseEntity .created(savedEmployee.getId() .map(id -> linkTo(methodOn(EmployeeController.class).findOne(id)).toUri()) .orElseThrow(() -> new RuntimeException("Failed to create for some reason"))) .body(assembler.toResource(savedEmployee)); }
/** * Use Spring to inject a {@link EmployeeRepository} that can then load data. Since this will run * only after the app is operational, the database will be up. * * @param repository */ @Bean CommandLineRunner init(EmployeeRepository repository) { return args -> { repository.save(new Employee("Frodo", "Baggins", "ring bearer")); repository.save(new Employee("Bilbo", "Baggins", "burglar")); }; }
@PostMapping("/employees") public ResponseEntity<Resource<Employee>> newEmployee(@RequestBody Employee employee) { Employee savedEmployee = repository.save(employee); return savedEmployee.getId() .map(id -> ResponseEntity .created(linkTo(methodOn(EmployeeController.class).findOne(id)).toUri()) .body(assembler.toResource(savedEmployee))) .orElse(ResponseEntity.notFound().build()); }
/** * Use Spring to inject a {@link EmployeeRepository} that can then load data. Since this will run * only after the app is operational, the database will be up. * * @param repository */ @Bean CommandLineRunner init(EmployeeRepository repository) { return args -> { repository.save(new Employee("Frodo", "Baggins", "ring bearer")); repository.save(new Employee("Bilbo", "Baggins", "burglar")); }; }
@PostMapping("/employees") ResponseEntity<?> newEmployee(@RequestBody Employee employee) { try { Employee savedEmployee = repository.save(employee); Resource<Employee> employeeResource = new Resource<>(savedEmployee, linkTo(methodOn(EmployeeController.class).findOne(savedEmployee.getId())).withSelfRel()); return ResponseEntity .created(new URI(employeeResource.getRequiredLink(Link.REL_SELF).getHref())) .body(employeeResource); } catch (URISyntaxException e) { return ResponseEntity.badRequest().body("Unable to create " + employee); } }
/** * Use Spring to inject a {@link EmployeeRepository} that can then load data. Since this will run * only after the app is operational, the database will be up. * * @param repository */ @Bean CommandLineRunner init(EmployeeRepository repository) { return args -> { repository.save(new Employee("Frodo", "Baggins", "ring bearer")); repository.save(new Employee("Bilbo", "Baggins", "burglar")); }; }
@GetMapping("/employees/{id}") ResponseEntity<Resource<Employee>> findOne(@PathVariable long id) { return repository.findById(id) .map(employee -> new Resource<>(employee, linkTo(methodOn(EmployeeController.class).findOne(employee.getId())).withSelfRel() .andAffordance(afford(methodOn(EmployeeController.class).updateEmployee(null, employee.getId()))) .andAffordance(afford(methodOn(EmployeeController.class).deleteEmployee(employee.getId()))), linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees") )) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); }
/** * Get a listing of ALL {@link Employee}s by querying the remote services' root URI, and then * "hopping" to the {@literal employees} rel. * * NOTE: Also create a form-backed {@link Employee} object to allow creating a new entry with * the Thymeleaf template. * * @param model * @return * @throws URISyntaxException */ @GetMapping public String index(Model model) throws URISyntaxException { Traverson client = new Traverson(new URI(REMOTE_SERVICE_ROOT_URI), MediaTypes.HAL_JSON); Resources<Resource<Employee>> employees = client .follow("employees") .toObject(new ResourcesType<Resource<Employee>>(){}); model.addAttribute("employee", new Employee()); model.addAttribute("employees", employees); return "index"; }
@PostMapping("/employees") ResponseEntity<?> newEmployee(@RequestBody Employee employee) { Employee savedEmployee = repository.save(employee); return new Resource<>(savedEmployee, linkTo(methodOn(EmployeeController.class).findOne(savedEmployee.getId())).withSelfRel() .andAffordance(afford(methodOn(EmployeeController.class).updateEmployee(null, savedEmployee.getId()))) .andAffordance(afford(methodOn(EmployeeController.class).deleteEmployee(savedEmployee.getId()))), linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees") ).getId() .map(Link::getHref) .map(href -> { try { return new URI(href); } catch (URISyntaxException e) { throw new RuntimeException(e); } }) .map(uri -> ResponseEntity.noContent().location(uri).build()) .orElse(ResponseEntity.badRequest().body("Unable to create " + employee)); }
/** * Get a listing of ALL {@link Employee}s by querying the remote services' root URI, and then * "hopping" to the {@literal employees} rel. * * NOTE: Also create a form-backed {@link Employee} object to allow creating a new entry with * the Thymeleaf template. * * @param model * @return * @throws URISyntaxException */ @GetMapping public String index(Model model) throws URISyntaxException { Traverson client = new Traverson(new URI(REMOTE_SERVICE_ROOT_URI), MediaTypes.HAL_JSON); Resources<Resource<Employee>> employees = client .follow("employees") .toObject(new ResourcesType<Resource<Employee>>(){}); model.addAttribute("employee", new Employee()); model.addAttribute("employees", employees); return "index"; }
/** * Look up a single {@link Employee} and transform it into a REST resource. Then return it through * Spring Web's {@link ResponseEntity} fluent API. * * See {@link #findAll()} to explain {@link GetMapping}'s "produces" argument. * * @param id */ @GetMapping(value = "/employees/{id}", produces = MediaTypes.HAL_JSON_VALUE) ResponseEntity<Resource<Employee>> findOne(@PathVariable long id) { return repository.findById(id) .map(employee -> new Resource<>(employee, linkTo(methodOn(EmployeeController.class).findOne(employee.getId())).withSelfRel(), linkTo(methodOn(EmployeeController.class).findAll()).withRel("employees"))) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); }
@Bean CommandLineRunner initDatabase(EmployeeRepository employeeRepository, ManagerRepository managerRepository) { return args -> { /* * Gather Gandalf's team */ Manager gandalf = managerRepository.save(new Manager("Gandalf")); Employee frodo = employeeRepository.save(new Employee("Frodo", "ring bearer", gandalf)); Employee bilbo = employeeRepository.save(new Employee("Bilbo", "burglar", gandalf)); gandalf.setEmployees(Arrays.asList(frodo, bilbo)); managerRepository.save(gandalf); /* * Put together Saruman's team */ Manager saruman = managerRepository.save(new Manager("Saruman")); Employee sam = employeeRepository.save(new Employee("Sam", "gardener", saruman)); saruman.setEmployees(Arrays.asList(sam)); managerRepository.save(saruman); }; } }