Gestion et traitement d'erreur
salut
j'utilise spring et je dois faire un traitement qui dépend d'un service externe.
Mon controleur
Code:
1 2 3 4 5
|
@RequestMapping(value = "/members/{memberId}/creditcard", method = RequestMethod.POST)
public void saveCreditCard(@PathVariable("memberId") Long memberId, @RequestBody CreditCardInfoDto creditCardInfo){
paymentService.saveCreditCard(creditCardInfo);
} |
Mon service
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
@Transactional
@Override
public void saveCreditCard(CreditCardInfoDto creditCardInfo) {
Member member = null;
if (creditCardInfo.getMemberId() != null) {
member = memberRepository.findOne(creditCardInfo.getMemberId());
}
List<PaymentGatewayConfig> paymentGateways = paymentGatewayConfigRepository.findAll();
if (paymentGateways != null && !paymentGateways.isEmpty()) {
PaymentGatewayConfig paymentGateway = paymentGateways.get(0);
String paymentGatewayKey = null;
if (member != null) {
paymentGatewayKey = member.getPaymentGatewayKey();
}
ResolveData resdata = null;
ResolverReceipt resreceipt = null;
if (paymentGatewayKey == null) {
ResAddCC resAddCC = new ResAddCC(creditCardInfo.getCreditCard(), creditCardInfo.getDateExpiration(), "7");
ResolverHttpsPostRequest mpgReq = new ResolverHttpsPostRequest(paymentGateway.getHost(), paymentGateway.getStoreId(), paymentGateway.getApiToken(), resAddCC);
resreceipt = mpgReq.getResolverReceipt();
resdata = resreceipt.getResolveData();
member.setPaymentGatewayKey(resreceipt.getDataKey());
} else {
ResUpdateCC resUpdateCC = new ResUpdateCC(member.getPaymentGatewayKey());
resUpdateCC.setPan(creditCardInfo.getCreditCard());
resUpdateCC.setExpdate(creditCardInfo.getDateExpiration());
ResolverHttpsPostRequest mpgReq = new ResolverHttpsPostRequest(paymentGateway.getHost(), paymentGateway.getStoreId(), paymentGateway.getApiToken(), resUpdateCC);
resreceipt = mpgReq.getResolverReceipt();
resdata = resreceipt.getResolveData();
}
if (resdata != null) {
//success
if(Boolean.valueOf(resreceipt.getComplete()) && !Boolean.valueOf(resreceipt.getTimedOut())){
member.setPaymentGatewayKey(resreceipt.getDataKey());
memberRepository.save(member);
}else{
//payment refused
log.error("saveCreditCard: " + member.getMemberId() + " payment refused error code: " + resreceipt.getResponseCode());
}
Operation operation = createOperation(resreceipt);
operationRepository.save(operation);
}
}
} |
Je me pose de nombreuse question.
Il peut avoir des erreurs de sauvegarde de donnée (voir les repository save), le payment peut être refusé (j'ai mis un log actuellement), un erreur de connexion à ResolverHttpsPostReques et peut-être d'autre type d'erreur.
Je me demande comment retourner cela au controlleur. Devrais-je séparer les types d'erreurs ou bien englober cela?
Dois-je mettre un try-catch à chaque endroit ou il peut avoir une erreur?
Malgré que j'ai regardé quelques articles sur les exceptions j'ai de la difficultés à mettre ça dans un cas concret comme celui-ci.
Idée comme ça
Autour de ResolverHttpsPostRequest un try catch exception
Dans le payment refused, je ferais peut-etre un throw PaymentRefusedException
Au niveau de la fonction un throws IOException, PaymentRefusedException
Si quelqu'un pouvait me guider?
merci