I found the reason that injecting HttpServletRequest did not work, it's because I did run my code in Jersey Test Framework, not within a proper Servlet container. It works if I run it in a proper Servlet container.
It is a pity that there is no pure JAX-RS way of getting the raw request body.