Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2018, 13:15   #1
alex-u
 
Регистрация: 05.07.2017
Сообщений: 7
По умолчанию Не получаю JSON при обработке ошибок с помощью ExceptionMapper(Jersey))

Я создал класс-обработчик ошибок, чтобы можно было бросать в нужном месте exceptions типа RuntimeException.
Во время выброса такого exception не происходит остановка программы, а Jersey обрабатывает ошибки, согласно правилам класса, который реализует интерфейс ExceptionMapper и формирует ответ клиенту в виде JSON-объекта, с деталями ошибок, построенными по определенной модели.

Модель для приема введенных учетных данных из формы.

Код:
public class UserCredentials {

    private String username;
    private String password;

    public UserCredentials() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
ресурс с конечными точками

Код:
@Path("auth")
   public class AuthenticationResource {
    @POST
    @Consumes( MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @PermitAll
    public Response authenticateUserName(UserCredentials credentials)  {

        EmployeeDao dao = new EmployeeDaoImpl();
        Employee email = dao.loadEmployeeByFieldStr("email", credentials.getUsername());

        if(email == null){
            throw new AccessDeniedException("Non found!");
        }

        credentials.setUsername(email.getEmail());
        Response response = Response.ok(credentials).build();

        return response;
    }
модель для деталей ошибок и конвертации из в JSON

Код:
@JsonInclude( JsonInclude.Include.NON_NULL)
public class ApiErrorDetails {

    private Integer status;
    private String title;
    private String message;
    private String path;

    public ApiErrorDetails() {
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setPath(String path) {
        this.path = path;
    }


}
класс-сопосnавитель exceptions

Код:
@Provider
       public class AccessDeniedExceptionMapper 
              implements   ExceptionMapper<AccessDeniedException> {

        @Context
        private UriInfo uriInfo;

        @Override
        public Response toResponse(AccessDeniedException exception) {


            Response.Status status = Response.Status.UNAUTHORIZED; 

            ApiErrorDetails errorDetails = new ApiErrorDetails();

            errorDetails.setStatus(status.getStatusCode());
            errorDetails.setTitle(status.getReasonPhrase());
            errorDetails.setMessage(exception.getMessage());


            errorDetails.setPath(uriInfo.getAbsolutePath().getPath());

            Response.ResponseBuilder statusResponse = Response.status(status);
            Response.ResponseBuilder entity =  
                                        statusResponse.entity(errorDetails);
            Response.ResponseBuilder type = 
                              entity.type(MediaType.APPLICATION_JSON);
            Response response = type.build();

            return response;
        }
    }
класс заменяющий регистрацию Jersey в web.xml

Код:
@ApplicationPath("/api/*")
public class JerseyConfig  extends ResourceConfig {

    public JerseyConfig() {

        packages("com.skillsimprover.restexamples.rest");
        register(AuthenticationResource.class);
        register(AccessDeniedExceptionMapper.class);
        register(AuthenticationExceptionMapper.class);
        register(DataNotFoundExceptionMapper.class);
    }
}
pom.xml

Код:
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>


    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.27</version>
    </dependency>


    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey.rest.version}</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>2.26</version>     
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>${servlets.version}</version>
        <scope>provided</scope>
    </dependency>

</dependencies>
Код:
public class AccessDeniedException extends RuntimeException {

    public AccessDeniedException() {
    }

    public AccessDeniedException(String message) {
        super(message);
    }
}
Во время отладки , когда возникает выброс исключения, класс AccessDeniedExceptionMapper исправно готовит ответ клиенту с кодом состояния и деталями ошибок, и передает Jersey.

Но клиент получает лишь код статуса, который я устанавливаю и все,
JSON с деталями приходит пустой {}

Jersey 2.27 на основе JAX-RS 2.x


В чем может быть проблема?
alex-u вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему при прогоне через дебаггер получаю другой результат slyscrat Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 05.11.2017 23:26
код вроде бы одинаков, но при втором варианте есть случаи когда при дальнейшей обработке counter получается состояние X. waleri Микроконтроллеры, робототехника, схемотехника, 3D принтеры 0 02.03.2017 22:20
Как отпарсить ответ от сервера с помощью json? nevender Помощь студентам 0 28.04.2016 21:44
при отправки post получаю socket error 10054 Smagulov85 Работа с сетью в Delphi 3 19.09.2012 01:03
Запуск QIP с помощью Delphi + отладчик ошибок beegl Общие вопросы Delphi 6 02.06.2008 11:07