salut


j'utilise spring et je dois faire un traitement qui dépend d'un service externe.

Mon controleur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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