【发布时间】:2017-04-13 18:06:23
【问题描述】:
我正在尝试在泽西岛的 MessageBodyReader 中阅读 APPLICATION_FORM_URLENCODED。当我尝试使用 BufferedReader 读取流时,该流返回空数据
这是我的代码:
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public class EmployeeReader implements MessageBodyReader<Employee> {
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return true;
}
@Override
public Employee readFrom(Class<Employee> type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
System.out.println(entityStream.available()); //Prints 0
BufferedReader br = new BufferedReader(new InputStreamReader(entityStream));
String data = br.readLine();
System.out.println("Stream Read:"+data);
//data is null here
.....
}
}
我可以看到数据是从我的 POST 请求中的表单以application/x-www-form-urlencoded 发送的,但是我无法在我的MessageBodyReader 中读取它。
在调试时,我可以看到 ByteChunk 保存了以下数据:
POST /Employees/employee HTTP/1.1
host:localhost:80800
connection:keep-alivee
content-length:144
postman-token:cf873d98-3208-292c-8fc1-6da8138a31faa
cache-control:no-cachee
origin:chrome-extension://fhbjgbiflinjbdggehcddcbncdddomopp
user-agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.366
content-type:application/x-www-form-urlencodedd
accept:*/**
accept-encoding:gzip, deflate, brr
accept-language:en-US,en;q=0.88
id=3&name=Test
更新
我刚刚发现这是SpringBootServletInitializer 的某种副作用。禁用此功能会导致上述代码正常工作。
有人可以帮忙吗?
【问题讨论】:
-
POST 参数作为请求参数到达 servlet,而不是作为消息体。
-
@EJP 我在独立的 Jersey 应用程序中看到了 Jersey 2.5 的相同代码,此代码在带有 Spring Boot 的 Jersey 2.23 中不起作用,此外,正如我在问题中提到的那样,我可以看到调试控制台中 InputStream 的 ByteChunk 中的数据(发布在问题中)(
id=3&name=Test)
标签: java web-services rest spring-boot jersey