Jax-RS exception'ları genel olarak yakalamanızı ve özelleştirmenizi sağlamaktadır. Aşağıdaki gibi bir sınıfın eklenmesi yeterlidir:
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mercury.rest.api.ApiResponse;
import com.mercury.rest.api.Error;
@Provider
public class GenericExceptionMapper implements ExceptionMapper<Throwable>{
private static Logger logger=LoggerFactory.getLogger(GenericExceptionMapper.class);
@Override
public Response toResponse(Throwable e) {
logger.error(e.getLocalizedMessage(),e);
ApiResponse apiResponse=new ApiResponse();
setHttpStatus(e, apiResponse);
apiResponse.setErrorCode("GENERIC_ERROR");
apiResponse.setErrorDesc(e.getMessage());
StringWriter errorStackTrace = new StringWriter();
e.printStackTrace(new PrintWriter(errorStackTrace));
apiResponse.setErrorDetails(errorStackTrace.toString());
apiResponse.setErrorMessage("Bir hata olustu");
return Response.status(apiResponse.getStatus())
.entity(apiResponse)
.type(MediaType.APPLICATION_JSON)
.build();
}
private void setHttpStatus(Throwable ex, ApiResponse errorMessage) {
if(ex instanceof WebApplicationException ) {
errorMessage.setStatus(((WebApplicationException)ex).getResponse().getStatus());
} else {
errorMessage.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode());
}
}
}
ExceptionMapper
sınıfını implement ederek tüm Throwable'dan türeyen exception'ların işleneceği bildirilmiştir. Bir hata oluştuğunda
Response toResponse(Throwable e)
yöntemi çağrılacaktır. Bu yöntemde exception'dan bir cevap üretilip verilmesi gerekir. ApiResponse sınıfını ekleyelim :
public class ApiResponse {
private int status;
private String errorCode;
private String errorDesc; // develoepr icin kisa aciklama
private String errorMessage; //kullanici icin
private String errorDetails; // developer icin detail
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorDesc() {
return errorDesc;
}
public void setErrorDesc(String errorDesc) {
this.errorDesc = errorDesc;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public String getErrorDetails() {
return errorDetails;
}
public void setErrorDetails(String errorDetails) {
this.errorDetails = errorDetails;
}
}
Bu sınıf cevaplar için kullanılan bir sınıftır.
Response.status(apiResponse.getStatus())
.entity(apiResponse)
.type(MediaType.APPLICATION_JSON)
.build();
ile apiResponse cevap olarak dönülmektedir.