JAX-RS и Jersey: SEVERE: сопоставленное исключение для ответа: 501 - PullRequest
0 голосов
/ 18 августа 2011

У нас есть метод ресурса JAX-RS, который обрабатывает запросы GET для нашего ресурса. Этот метод GET в настоящее время не реализован, и мы хотели бы вернуть код ответа, который говорит так.

Изначально мы использовали следующую технику для получения ответа 501:

Response.status (501)

Это приводит к СЕРЬЕЗНЫМ предупреждениям в наших журналах (SEVERE: сопоставленное исключение для ответа: 501), что вызывает недовольство команды QA и нашего менеджера по разработке.

Вот что мы делаем сейчас (чтобы избежать предупреждения):

public class JaxrsResponseStatus501NotImplemented implements StatusType {

public Family getFamily() {
    return Family.SERVER_ERROR;
}

public String getReasonPhrase() {
    return "Not Implemented";
}

public int getStatusCode() {
    return 501;
}

}

И это в методе JAX-RS:

public ResourceDto getResource(@PathParam("resource_id") String resourceId) {
    throw new WebApplicationException(Response.status(new JaxrsResponseStatus501NotImplemented()).entity(ERROR_MESSAGE_GET_NOT_IMPLEMENTED).build());
}

Мои вопросы:

1) Почему не определен Response.Status.NOT_IMPLEMENTED? Большинство других типичных ответов определяются библиотекой как константы, но я не вижу 501, предопределенных в версии 1.8, которую я использую.

Я делаю вижу, что он определен в ClientResponse.Status, но у меня сложилось впечатление, что иерархия пакетов com.sun.jersey.api.client предназначена для разработки на стороне клиента. Я даже не думаю, что сейчас вытаскиваю эту банку.

2) Как правильно отправлять ответ 501? При отсутствии Response.Status.NOT_IMPLEMENTED (или любого другого ответа, у которого нет предварительно определенной константы), является ли способ выше (пользовательское исключение, реализующее StatusType) правильным путем?

3) Когда вы реализуете StatusType (при условии, что вам это необходимо), как вы узнаете, с каким «семейством» связано исключение? Для чего используются семейные ассоциации? Где они используются?

Спасибо!

Ответы [ 3 ]

1 голос
/ 18 августа 2011

Лично я бы просто использовал Response.status(501) и продолжил бы жизнь.

Обновление: Хорошо, я не уверен, где это СЕРЬЕЗНОидет от.Я не знаю, видел ли я это когда-нибудь, но если вы углубитесь в этот метод состояния, вы обнаружите, где он попадет в следующий код:

default: {
    return new StatusType() {
        @Override
        public int getStatusCode() {
            return statusCode;
        }

        @Override
        public Family getFamily() {
            return toFamilyCode(statusCode);
        }

        @Override
        public String getReasonPhrase() {
            return "";
        }
    };
}

, а toFamilyCode () - это

public static Family toFamilyCode(final int statusCode) {
    switch(statusCode / 100) {
        case 1: return Family.INFORMATIONAL;
        case 2: return Family.SUCCESSFUL;
        case 3: return Family.REDIRECTION;
        case 4: return Family.CLIENT_ERROR;
        case 5: return Family.SERVER_ERROR;
        default: return Family.OTHER;
    }
}

Это должно дать вам некоторое руководство.

0 голосов
/ 20 сентября 2011

Все.Я чувствую себя очень глупо.

Выложенное мною решение, которое создает пользовательское исключение, прекрасно работает.Но это совершенно не нужно и не решает проблему (серьезное предупреждение в журналах).

После некоторого времени, проведенного с источником в Джерси (что я должен был сделать в первую очередь), выясняется, чтоисключение с кодом ответа 500 или выше будет выдавать это серьезное исключение.Не имеет значения, как вы добавите этот код состояния в исключение.

Очень жаль красную сельдь.

0 голосов
/ 20 сентября 2011

Очевидно, что создание пользовательского исключения необходимо, чтобы избежать предупреждения журнала SEVERE. Единственный оставшийся без ответа вопрос - что использовать для семейного кода в этом пользовательском исключении для ошибки 501.

Быстрая проверка кода на стороне клиента в Джерси (который, как ни странно, определяет ответ статуса 501) показывает, что они определяют код состояния следующим образом:

       Status(final int statusCode, final String reasonPhrase) {
        this.code = statusCode;
        this.reason = reasonPhrase;
        switch(code/100) {
            case 1: this.family = Family.INFORMATIONAL; break;
            case 2: this.family = Family.SUCCESSFUL; break;
            case 3: this.family = Family.REDIRECTION; break;
            case 4: this.family = Family.CLIENT_ERROR; break;
            case 5: this.family = Family.SERVER_ERROR; break;
            default: this.family = Family.OTHER; break;
        }
    }

Это помещает любые ошибки серии 500 в категорию Family.SERVER_ERROR. Просто к вашему сведению

...