О Spring Transaction Manager - PullRequest
       1

О Spring Transaction Manager

0 голосов
/ 27 марта 2012

В настоящее время я использую весенний декларативный менеджер транзакций в моем приложении.Если во время операций с БД нарушено какое-либо ограничение, я хочу проверить код ошибки в базе данных.Я имею в виду, я хочу выполнить один запрос select после того, как произошло исключение.Поэтому я ловлю исключение DataIntegrityViolationException внутри моего блока Catch, а затем пытаюсь выполнить еще один запрос кода ошибки.Но этот запрос не выполняется.Я предполагаю, что поскольку я использую диспетчер транзакций, если произошло какое-либо исключение, следующий запрос не выполняется.Это правильно?.я хочу выполнить этот запрос кода ошибки, прежде чем вернуть результаты клиенту.Есть ли способ сделать это?

@Override
@Transactional
    public LineOfBusinessResponse create(
        CreateLineOfBusiness createLineOfBusiness)
        throws GenericUpcException {
        logger.info("Start of createLineOfBusinessEntity()");


        LineOfBusinessEntity lineOfBusinessEntity =
            setLineOfBusinessEntityProperties(createLineOfBusiness);
        try {
            lineOfBusinessDao.create(lineOfBusinessEntity);
            return setUpcLineOfBusinessResponseProperties(lineOfBusinessEntity);

        }
        // Some db constraints is failed
        catch (DataIntegrityViolationException dav) {

            String errorMessage =
                errorCodesBd.findErrorCodeByErrorMessage(dav.getMessage());
            throw new GenericUpcException(errorMessage);
        }
        // General Exceptions handling
        catch (Exception exc) {
            logger.debug("<<<<Coming inside General >>>>");
            System.out.print("<<<<Coming inside General >>>>");
            throw new GenericUpcException(exc.getMessage());
        }

    }

public String findErrorCodeByErrorMessage(String errorMessage)throws GenericUpcException {
        try{
        int first=errorMessage.indexOf("[",errorMessage.indexOf("constraint"));
        int last=errorMessage.indexOf("]",first);
        String errorCode=errorMessage.substring(first+1, last);
        //return errorCodesDao.find(errorCode);
        return errorCode;
        }
        catch(Exception e)
        {
            throw new GenericUpcException(e.getMessage());
        }


    }

Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 27 марта 2012

Не думаю, что описываемая вами проблема имеет какое-либо отношение к управлению транзакциями. Если DataIntegrityViolationException происходит в вашем try() блоке, ваш код в catch() должен выполняться. Возможно, исключение отличается от DataIntegrityViolationException, или findErrorCodeByErrorMessage() выдает другое исключение. В общем, логика транзакций будет применяться только после того, как вы вернетесь из вызова метода, до тех пор, пока вы не сможете делать все, что захотите, используя обычные конструкции языка Java. Я предлагаю вам установить точку останова в обработчике ошибок или в некоторых инструкциях отладки, чтобы увидеть, что на самом деле происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...