2013-09-13 2 views
0

Я разрабатываю REST-фасад для службы EJB, что означает, что он вызывает EJB, преобразует результат в представления, которые REST-caller поймет, а затем вернет (как json или xml). Все это великолепно. Но служба EJB выбрасывает множество исключений, e. г. когда результат не найден или несколько других случаев. Так как я не хочу, чтобы те, распространяющийся REST-вызывающему, я осуществил ExceptionMapper:Resteasy ExceptionMapper не возвращает результат

public class EjbExceptionMapper implements ExceptionMapper<EJBException> { 

    private static final Logger logger = LoggerFactory.getLogger(EjbExceptionMapper.class); 

    @Override 
    public Response toResponse(final EJBException exception) { 
     ResponseBuilder result = Response.status(Status.BAD_REQUEST); 
     logger.debug("Bad request:", exception); 
     if (exception.getCause() != null) { 
      final Throwable cause = exception.getCause(); 
      if (cause instanceof NoDeliveryFoundException) { 
       logger.debug("Found NoDeliveryFoundException:", cause); 
       result = Response.status(Status.NO_CONTENT).entity(cause.getMessage()); 
      } 
     } 
     return result.build(); 
    } 
} 

Все исключения из моего EJB-службы поступите javax.ejb.EJBException, что этот Mapper удается поймать просто отлично, с различными обычаями Исключения приложения как причины. План заключается в возврате различных ответов в зависимости от типа причины исключения EJBException. Логгер-вызовы, используемые для отладки, выполняются, если я получаю исключение NoDeliveryFoundException в качестве причины, поэтому я знаю, что он выполнен (правильно зарегистрирован Mapper и используется для сопоставления), но клиент никогда не видит ответа.

Каждый вызов, ведущий к исключению EJBException в базовой службе (и, следовательно, использование этого ExceptionMapper), вообще не приводит к отклику, как если бы метод toResponse() возвращал значение null, а не настраиваемый ответ Response.

Я даже зашел так далеко, чтобы зарегистрировать ответ прямо перед его возвратом, он существует и содержит то, что я ожидаю, поэтому я уверен, что он возвращается методом toResponse. Но все же мой клиент не получает ответа.

Итак, теперь я в тупике, и поскольку ни один поиск не смог найти кого-то, описывающего подобную проблему, я обращаюсь к вам, дорогая. ;)

ответ

2

Ваш метод toResponse -method содержит противоречивую логику.

Response.status(Status.NO_CONTENT).entity(cause.getMessage());

Здесь вы присваиваете код статуса HTTP 204 No Content, но вы также добавить ответ. Вы не можете установить статус 204 No Content и вернуть тело ответа одновременно.

Кроме того, если Exception#getCause() равно нулю или если это не экземпляром NoDeliveryFoundException, тело ответа пуст.

Это может быть причиной ваших проблем?

+0

Наверное, нет, поскольку моя проблема заключается не в том, что я получаю ответ с пустой сущностью или чем-то подобным. Я вообще не получаю ответа, клиент даже не получает код состояния HTTP. Пустое тело ответа было бы замечательным, если бы я, по крайней мере, получил код для клиента. – sheltem

+1

И какой клиент вы используете? Если вы используете 'curl' с флагом' --verbose', что вы получите? – eiden

+0

Я использовал либо браузер напрямую, либо простой клиент REST для Opera. Когда я вернусь в офис, мне придется проверять с завитом. Я не работаю в воскресенье. ;) – sheltem

Смежные вопросы