package ameba.message.error;
import org.glassfish.jersey.message.MessageBodyWorkers;
import org.glassfish.jersey.server.ContainerResponse;
import javax.annotation.Priority;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.ws.rs.Priorities;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.util.List;
/**
* <p>StatusMapper class.</p>
*
* @author icode
*
*/
@Singleton
@Priority(Priorities.HEADER_DECORATOR - 1)
public class StatusMapper implements ContainerResponseFilter {
@Context
private Provider<MessageBodyWorkers> workersProvider;
/**
* {@inheritDoc}
*/
@Override
public void filter(ContainerRequestContext requestContext,
ContainerResponseContext responseContext) throws IOException {
if (!responseContext.hasEntity()
&& !((ContainerResponse) responseContext).isMappedFromException()
&& responseContext.getStatus() >= 400
&& responseContext.getStatus() < 600) {
throw new WebApplicationException(responseContext.getStatus());
}
List<MediaType> types = null;
// 找不到 writer/reader, 提供系统有的 writer/reader 输出错误
if (responseContext.getStatus() == 406) {
types = workersProvider.get()
.getMessageBodyWriterMediaTypes(
responseContext.getEntityClass(),
responseContext.getEntityType(),
responseContext.getEntityAnnotations());
} else if (responseContext.getStatus() == 415) {
types = workersProvider.get()
.getMessageBodyReaderMediaTypes(
responseContext.getEntityClass(),
responseContext.getEntityType(),
responseContext.getEntityAnnotations());
}
if (types != null) {
((ContainerResponse) responseContext).setMediaType(parseMediaType(types));
}
}
private MediaType parseMediaType(List<MediaType> types) {
if (types != null && types.size() > 0) {
return types.get(0);
} else {
return MediaType.TEXT_HTML_TYPE;
}
}
}