Logging json posts with resteasy

前端 未结 2 1265
醉梦人生
醉梦人生 2021-01-18 11:53

I\'m looking for a way to log JSON posts in a RESTEASY framework.

I woul like to log the POST body to log file to see what the client is sending to me.

Is t

相关标签:
2条回答
  • 2021-01-18 12:14

    You can use a ContainerRequestFilter:

    @Provider
    public class LogFilter implements ContainerRequestFilter {
    
        private Logger LOG = LoggerFactory.getLogger(LogFilter.class);
    
        @Override
        public void filter(ContainerRequestContext requestContext) throws IOException {
    
            if (!"POST".equals(requestContext.getMethod()) 
                    || !MediaType.APPLICATION_JSON_TYPE.equals(requestContext.getMediaType())
                    || requestContext.getEntityStream() == null) {
                return;
            }
    
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            IOUtils.copy(requestContext.getEntityStream(), baos);
            byte[] bytes = baos.toByteArray();
            LOG.info("Posted: " + new String(bytes, "UTF-8"));
            requestContext.setEntityStream(new ByteArrayInputStream(bytes));
    
        }
    
    }
    

    Instead of checking for Method and Content-Type you can also register this filter per @NameBinding only where you need it.

    Note: This simple example copies the InputStream of the request so it will be read twice (maybe a performance problem).

    0 讨论(0)
  • 2021-01-18 12:34

    As supplement of excellent answer of lefloh, I suggest replace:

    !MediaType.APPLICATION_JSON_TYPE.equals(requestContext.getMediaType())
    

    with

    !MediaType.APPLICATION_JSON_TYPE.isCompatible(requestContext.getMediaType())
    

    equals method takes into account parameters of media type, eg. charset=UTF-8, and does not work in some scenarios according to intention of lefloh. isCompatible compares only type and subtype of media type and is more suitable in this case.

    PS. I know, this post should be placed as comment, but I have no enough level of reputation to do it. I also edited lefloh answer but some php and ios guys rejected it.

    0 讨论(0)
提交回复
热议问题