2013-11-07 2 views
8

Я пытаюсь добавить ссылки HATEOAS на ресурс JSON, обслуживаемый контроллером Spring REST.Определение ассемблера ресурсов для контроллера REST Spring HATEOAS

Я вижу, я должен использовать ассемблер ресурс, как описано в https://github.com/spring-projects/spring-hateoas

Пример показывает класс Person и класс PersonResource.

Я понимаю, класс PersonResource определяется как:

public class PersonResource extends ResourceSupport { 
} 

Что то класс Person? Является ли это классом домена данных?

В моем случае, я определил класс администратора, который является классом домена REST, и я определил его как имеющая поддержку ресурсов:

public class Admin extends ResourceSupport { 

    private String firstname; 
    private String lastname; 
    private String email; 
    private String login; 
    private String password; 
    private String passwordSalt; 

    public Admin() { 
    } 

    public String getFirstname() { 
     return this.firstname; 
    } 

    public void setFirstname(String firstname) { 
     this.firstname = firstname; 
    } 

    public String getLastname() { 
     return this.lastname; 
    } 

    public void setLastname(String lastname) { 
     this.lastname = lastname; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getLogin() { 
     return this.login; 
    } 

    public void setLogin(String login) { 
     this.login = login; 
    } 

    public String getPassword() { 
     return this.password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getPasswordSalt() { 
     return passwordSalt; 
    } 

    public void setPasswordSalt(String passwordSalt) { 
     this.passwordSalt = passwordSalt; 
    } 

    public EventAdmin toEventAdmin() { 
     EventAdmin eventAdmin = new EventAdmin(); 

     BeanUtils.copyProperties(this, eventAdmin); 

     return eventAdmin; 
    } 

    public static Admin fromEventAdmin(EventAdmin eventAdmin) { 
     Admin admin = new Admin(); 

     BeanUtils.copyProperties(eventAdmin, admin); 

     return admin; 
    } 

} 

Моего контроллер REST видит только этот администратор класса, так как это REST класс домена. Он не знает и не должен знать ни о каком классе домена данных.

Так что мне интересно, как использовать поддержку ассемблера ресурсов здесь.

Я не понимаю, почему у меня должен быть класс админ домена дополнительной информации.

Уважение,

После ответа Майка вот как мой контроллер теперь выглядит следующим образом:

@RequestMapping(method = RequestMethod.POST, produces = "application/json; charset=utf-8") 
@ResponseBody 
public ResponseEntity<Admin> add(@RequestBody Admin admin, UriComponentsBuilder builder) { 
    AdminCreatedEvent adminCreatedEvent = adminService.add(new CreateAdminEvent(admin.toEventAdmin())); 
    HttpHeaders responseHeaders = new HttpHeaders(); 
    responseHeaders.add("Content-Type", "application/json; charset=utf-8"); 
    responseHeaders.setLocation(builder.path("/admin/{id}").buildAndExpand(adminCreatedEvent.getAdminId()).toUri()); 
    Admin createdAdmin = adminResourceAssembler.toResource(adminCreatedEvent.getEventAdmin()); 
    ResponseEntity<Admin> responseEntity = new ResponseEntity<Admin>(createdAdmin, responseHeaders, HttpStatus.CREATED); 
    return responseEntity; 
} 

До, вместо того, чтобы использовать ассемблер ресурса я делал:

Admin createdAdmin = Admin.fromEventAdmin(adminCreatedEvent.getEventAdmin()); 
createdAdmin.add(linkTo(methodOn(AdminController.class).add(createdAdmin, builder)).withSelfRel()); 

Но он не дал мне идентификатор ресурса в URL-адресе.

ответ

7

Реализация ResourceAssembler должна знать как класс домена данных, так и класс домена REST, поскольку его задачей является преобразование первого в последний.

Если вы хотите сохранить знания своих классов данных вне своего контроллера, вы можете сделать сервис преобразования ресурсов, который будет извлекать данные из репо и использовать ResourceAssembler, чтобы превратить его в ресурсы, о которых может знать контроллер.

@Component 
public class AdminResourceAssembler extends ResourceAssemblerSupport<Admin, AdminResource> { 
    public AdminResourceAssembler() { 
     super(AdminController.class, AdminResource.class); 
    } 

    public AdminResource toResource(Admin admin) { 
     AdminResource adminResource = createResourceWithId(admin.getId(), admin); // adds a "self" link 
     // TODO: copy properties from admin to adminResource 
     return adminResource; 
    } 
} 

@Service 
public class AdminResourceService { 
    @Inject private AdminRepository adminRepository; 
    @Inject private AdminResourceAssembler adminResourceAssembler; 

    @Transactional 
    public AdminResource findOne(Long adminId) { 
     Admin admin = adminRepository.findOne(adminId); 
     AdminResource adminResource = adminResourceAssembler.toResource(admin); 
     return adminResource; 
    } 
} 

@Controller 
@RequestMapping("/admins") 
public class AdminController { 
    @Inject private AdminResourceService adminResourceService; 

    @RequestMapping(value="/{adminId}", method=RequestMethod.GET) 
    public HttpEntity<AdminResource> findOne(@PathVariable("adminId") Long adminId) { 
     AdminResource adminResource = adminResourceService.findOne(adminId); 
     return new ReponseEntity<>(adminResource, HttpStatus.OK); 
    } 
} 
+0

Факт в том, что я также пытаюсь отделить домен данных от домена REST с использованием событий, действующих как порты связи с основным бизнес-приложением. Интересно, не слишком ли это. Во всяком случае, он отлично работал со следующим в моем контроллере: Admin createdAdmin = adminResourceAssembler.toResource (adminCreatedEvent.getEventAdmin()); – Stephane

+0

Теперь я задаюсь вопросом, как иметь ссылки на дополнительный ресурс. Пока что внутри моего основного ресурса ресурс администратора не имеет своих ссылок, поскольку метод toResource ассемблера предоставил только ссылки для основного ресурса ребенка. – Stephane

+0

Spring Data REST делает это и [PersistentEntityResourceAssembler] (https://github.com/spring-projects/spring-data-rest/blob/aa28aebca5cf9e14ac52128f0cd8b0a71672c9f7/spring-data-rest-webmvc/src/main/java/org/ springframework/data/rest/webmvc/PersistentEntityResourceAssembler.java) может быть хорошим местом, чтобы начать выяснять, как эта часть работает. –

Смежные вопросы