Java 如何使用ContainerResponseFilter读取RESTful服务的响应正文?

Java 如何使用ContainerResponseFilter读取RESTful服务的响应正文?,java,rest,jersey,Java,Rest,Jersey,我正在使用Jersey,我试图用我的方法访问responset主体,非常类似于这个问题: 如何使用Jersey读取RESTful服务的响应正文? 我和邮递员一起寄出了我的身价 @Provider @PreMatching public class LoggingFilter implements ContainerRequestFilter, ContainerResponseFilter { final Logger logger = Logger.getLogger(LoggingF

我正在使用Jersey,我试图用我的方法访问responset主体,非常类似于这个问题:
如何使用Jersey读取RESTful服务的响应正文?
我和邮递员一起寄出了我的身价

@Provider
@PreMatching
public class LoggingFilter implements ContainerRequestFilter, ContainerResponseFilter
{
    final Logger logger = Logger.getLogger(LoggingFilter.class);

    @Override
        public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
        {
            logger.info("------------------------------------------------------------");
            logger.info("Container-Response");
            logger.info("Status: " + responseContext.getStatus());

            for (Map.Entry<String, List<Object>> entry : responseContext.getHeaders().entrySet())
            {
                logger.info(entry.getKey() + ":" + entry.getValue().toString());
            }

            BufferedReader br;
            try
            {
                br = new BufferedReader(new InputStreamReader((InputStream) responseContext.getEntity(), "UTF-8"));

                        StringBuilder xml = new StringBuilder();
                String line;

                while ((line = br.readLine()) != null)
                {
                    xml.append(line);
                }

                logger.info(xml);
                responseContext.setEntity(new ByteArrayInputStream(xml.toString().getBytes("UTF-8")));
            } catch (IOException e)
            {

                e.printStackTrace();

            }

        }

 }
@Provider
@预匹配
公共类LoggingFilter实现ContainerRequestFilter、ContainerResponseFilter
{
最终记录器=Logger.getLogger(LoggingFilter.class);
@凌驾
公共无效筛选器(ContainerRequestContext requestContext、ContainerResponseContext responseContext)
{
logger.info(“-------------------------------------------------------------------------------------”);
logger.info(“容器响应”);
logger.info(“状态:+responseContext.getStatus());
对于(Map.Entry:responseContext.getHeaders().entrySet())
{
logger.info(entry.getKey()+”:“+entry.getValue().toString());
}
缓冲剂;
尝试
{
br=新的BufferedReader(新的InputStreamReader((InputStream)responseContext.getEntity(),“UTF-8”);
StringBuilder xml=新的StringBuilder();
弦线;
而((line=br.readLine())!=null)
{
append(行);
}
logger.info(xml);
setEntity(新的ByteArrayInputStream(xml.toString().getBytes(“UTF-8”));
}捕获(IOE异常)
{
e、 printStackTrace();
}
}
}
错误:2017年4月4日上午9:52:55 org.apache.catalina.core.StandardWrapperValve调用SCHWERWIEGEND: Servlet[Jersey REST service]的Servlet.service(),位于 路径[/update]引发异常[java.lang.ClassCastException: de.beracom.update.UpdateInformation无法强制转换为 具有根本原因java.lang.ClassCastException的java.io.InputStream] de.beracom.update.UpdateInformation无法强制转换为 java.io.InputStream位于 de.beracom.update.LoggingFilter.filter(LoggingFilter.java:92)


来自
getEntity
的实体正是您从资源方法返回的实体。这就是为什么会出现错误。你为什么不直接使用,而不是试着写你自己的。我是怎么做到的,用LoggingFilter/Feature?只要用Jersey注册
LoggingFeature
。阅读我链接到的文档以了解更多详细信息。我想读取XML(字符串)并将其写入log.txt文件。不要使用LoggingFeature输出到服务器。您可以将自己的
java.util.logging.Logger
传递给
LoggingFeature
构造函数。看看另见