2013-03-08 6 views
0

Скажем, из службы весны я хочу вызвать через клиента внешнюю систему, если этот вызов завершится с ошибкой (выбрасывает исключение), я хочу его зарегистрировать, обновить статус заказа в DB и перестроить исключение для транзакции, подлежащей откату ...Захват Java/Spring Исключения/Регистрация и обновление статуса

Я знаю, что под образцом кода считается анти-шаблон, но я не могу придумать что-то лучшее для достижения этого ... любые комментарии PLS?

public class Service { 

@Autowired(required = true) 
private Client client; 

@Autowired(required = true) 
private DAO d; 

@Transactional 
@Override 
public void register(String id) { 

    try{ 
     client.invoke(id);//throws Client unchecked exception 
    } 
    catch (ClientException e){ 
     LOG.error (e); 
     d.updateStatus(id,"failed"); 
     throw e; 
     } 
} 
} 
+0

это должно быть хорошо. Но в catch вы должны написать: 'throw new ClientException (e)'. – Anubhab

+1

Почему? обертка исключения имеет только интерес, если тип обертки отличается от исходного. Он делает это хорошим способом – Gab

+0

да, бросьте e; просто реконструирует мое исключение ... но есть ли лучший способ добиться этого? – boom123

ответ

0

Если вы бросаете исключение просто сделать откат транзакции, вы должны лучше потреблять его и называют setRollbackOnly

TransactionInterceptor.currentTransactionStatus().setRollbackOnly(); 
+0

Да, я знаю об этом, но весной Documentantion снова считается ПЛОХОЙ практикой ... – boom123

+0

Возможно, вы можете найти свое решение здесь, так что http://forum.springsource.org/showthread.php?79852-Programmatically-rollback- the-CURRENT-transaction – Gab

+0

В любом случае, в JPA правильным способом будет использование 'EJBContext.setRollbackOnly()'. Я, однако, не очень хорошо знаю весеннюю практику, но я не понимаю, почему это должно быть иначе – Gab