Я создал класс-обработчик ошибок, чтобы можно было бросать в нужном месте
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
В чем может быть проблема?