Restlet - передача кода состояния ошибки и трассировки исключений с сервера на клиент - PullRequest
0 голосов
/ 24 января 2012

У нас есть restlet сервер и клиент. Нам нужно передать статус ошибки и трассировки исключений обратно клиенту, чтобы клиент мог предпринять соответствующие действия в зависимости от кода ошибки. Я прочитал о StatusService и использую метод response.setStatus(), но не могу отобразить конкретные исключения, возникающие при обработке на стороне сервера, на стороне клиента. Слой DAO с сервера генерирует определенные связанные с БД исключения и код состояния, такие как (нарушение уникального ключа и т. Д.), Которые клиент должен увидеть и предпринять соответствующие действия.

Кроме того, как обычно это делается для централизованной обработки ошибок на стороне сервера и клиента? Фильтры?

Краткий пример действительно поможет.

Спасибо, Deep

1 Ответ

1 голос
/ 24 января 2012

Вы можете отправлять только коды состояния HTTP и, по желанию, свое собственное сообщение с описанием. Вы также можете отправить представление об ошибке, переопределив getRepresentation в StatusService.

@Override
public Status getStatus(Throwable throwable, Resource resource) {
    Status ret = null;
    Throwable cause = throwable.getCause();
    if (cause == null) {
        Status status = super.getStatus(throwable, resource);
        ret = new Status(status, throwable.getMessage());
        log.log(Level.SEVERE, "Unexpected resource exception <" + ret.toString() + "> for throwable of type <" + throwable + "> at resource <" + resource + ">");
    } else if (cause instanceof NotFoundException) {
        ret = new Status(Status.CLIENT_ERROR_NOT_FOUND, cause, resource.getReference().toString());
        log.info("Not found <" + ret.toString() + "> for throwable of type <" + cause + "> at resource <" + resource + ">");
    } else if (cause instanceof ConstraintViolationsException) {
        ConstraintViolationsException e = (ConstraintViolationsException) cause;
        ret = new Status(Status.CLIENT_ERROR_BAD_REQUEST, cause, e.getViolations().iterator().next().getMessage());
        log.log(Level.SEVERE, "Constraint violation <" + e.getViolations().iterator().next().getMessage() + "> at resource <" + resource + ">");
    } else if (cause instanceof BusinessRuleException) {
        ret = new Status(Status.CLIENT_ERROR_BAD_REQUEST, cause, cause.getMessage());
        log.log(Level.SEVERE, "Business rule exception: <" + cause.getMessage() + "> at resource <" + resource + ">");
    } else {
        Status status = super.getStatus(throwable, resource);
        ret = new Status(status, throwable.getMessage());
        log.log(Level.SEVERE, "Unexpected server exception <" + ret.toString() + "> for throwable of type <" + throwable + "> at resource <" + resource + ">");
    }
    return ret;
}

@Override
public Representation getRepresentation(Status status, Request request, Response response) {
    String ret = "";
    if (status.getDescription() != null) {
        ret = status.getDescription();
    } else {
        ret = "unknown error";
    }
    return new StringRepresentation(ret, MediaType.TEXT_PLAIN);
}

Вы можете вернуть представление ошибки в getRepresentation в любом формате (XML, JSON, HTML), который вы хотите.

...