Στο component index-page της Angular, θα εμφανίζουμε τις προσφορές. Οπότε, θα δημιουργήσουμε μια μέθοδο στον controller, η οποία θα επιστρέφει τις προσφορές στον client.
Δημιουργούμε ένα repository DealRepository.
package springeshop.repositories;
@Repository
public interface DealRepository extends JpaRepository<Deal, Integer> {
}
Δημιουργούμε το interface DealService στο springeshop.service.
package springeshop.service;
public interface DealService{
List<Deal> findAllDeals();
}
Δημιουργούμε την υλοποίηση του, DealServiceImpl
package springeshop.service;
@Service("dealService")
@Transactional
public class DealServiceImpl implements DealService{
@Autowired
private DealRepository dealRepository;
@Override
public Listt<Deal> findAllDeals() {
return dealRepository.findAll();
}
}
Δημιουργούμε ένα repository DealImageRepository.
package springeshop.repositories;
@Repository
public interface DealImageRepository extends JpaRepository<DealImage, Integer> {
DealImage findByDeal(Deal deal);
}
Δημιουργούμε το interface DealImageService στο springeshop.service.
package springeshop.service;
public interface DealImageService{
DealImage findByDeal(Deal deal);
}
Δημιουργούμε την υλοποίηση του, DealImageServiceImpl
package springeshop.service;
@Service("dealImageService")
@Transactional
public class DealImageServiceImpl implements DealImageServiceImpl{
@Autowired
private DealImageRepository dealImageRepository;
@Override
public DealImage findByDeal(Deal deal) {
return dealImageRepository.findByDeal(deal);
}
}
Θα δημιουργήσουμε έναν controller DealApiController στο πακέτο springeshop.controller . Όταν ο client πραγματοποιεί ένα HTTP GET αίτημα στο localhost:8080/api/deals, η μέθοδος getDeals θα επιστρέφει όλες τις προσφορές σε μορφή JSON.
Επίσης, θα προσθέσουμε ένα field imageUrl στο entity Deal.java . Αυτό αναπαριστά το URL της εικόνας της προσφοράς και θα παίρνει τιμή, από το DealImage entity. Χρησιμοποιούμε το annotation @Transient, για να δηλώσουμε ότι δεν θέλουμε, να αποθηκευτεί στη βάση, αλλά θέλουμε να επιστρέφεται στην JSON απάντηση.
@Transient
private String imageUrl;
package springeshop.controller;
@RestController
@RequestMapping("/api")
public class DealApiController{
public static final Logger logger = LoggerFactory.getLogger(DealApiController.class);
@Autowired
private DealService dealService;
@Autowired
private DealImageService dealImageService;
@RequestMapping(value = "/deals", method = RequestMethod.GET)
public ResponseEntity<?> getDeals(){
...
Η μέθοδος findAllDeals πραγματοποιεί το ερώτημα "Select d from Deal d" και επιστρέφει μια λίστα με τις προσφορές Deals.
List<Deal> deals = dealService.findAllDeals();
if(deals.isEmpty()){
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
Η μέθοδος findByDeal επιστρέφει την αντίστοιχη εικόνα για κάθε προσφορά. Στέλνουμε στην απάντηση status 200 ΟΚ και τις προσφορές.
for(Deal deal : deals){
DealImage dealImage = dealImageService.findByDeal(deal);
deal.setImageUrl(dealImage.getUrl());
}
return new ResponseEntity<List<Deal>>(deals, HttpStatus.OK);
Παράδειγμα αιτήματος με Postman