Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding business logic to a spring-data-rest application

Tags:

I have been experimenting with spring-data-rest (SDR) and am really impressed with how quickly I can build a rest api. My application is based around the following repository which gives me GET /attachements and POST /attachements

package com.deepskyblue.attachment.repository;  import java.util.List;  import org.springframework.data.repository.Repository;  import com.deepskyblue.attachment.domain.Attachment;  public interface AttachmentRepository extends Repository<Attachment, Long> {      List<Attachment> findAll();      Attachment save(Attachment attachment); } 

One thing I am confused about though is how I add custom business logic. SDR seems great if I just want a rest API to my data, however a traditional Spring application would normally have a service tier where I can have business logic. Is there a way of adding this business logic with SDR?

like image 496
Richard Hensman Avatar asked Mar 31 '17 06:03

Richard Hensman


2 Answers

There are many possibilities.

  1. Validators (http://docs.spring.io/spring-data/rest/docs/current/reference/html/#validation) for validating received objects.

  2. Event Handlers http://docs.spring.io/spring-data/rest/docs/current/reference/html/#events) that will be called when validation was okay.

  3. Custom Controllers (http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.overriding-sdr-response-handlers) when you manually want to handle the request.

like image 102
benkuly Avatar answered Sep 19 '22 09:09

benkuly


I ended up creating a custom Aspect that's around repository method. Something like this (groovy):

@Aspect @Component @Slf4j class AccountServiceAspect {  @Around("execution(* com.test.accounts.account.repository.AccountRepository.save*(..))")     Object saveAccount(ProceedingJoinPoint jp) throws Throwable {         log.info("in aspect!")         Object[] args = jp.getArgs()          if (args.length <= 0 || !(args[0] instanceof Account))             return jp.proceed()          Account account = args[0] as Account          account.active = true         jp.proceed(account)     } } 

Not ideal but you can modify model before saving it without writing spring data rest controllers from scratch.

like image 42
kazuar Avatar answered Sep 20 '22 09:09

kazuar