gpt4 book ai didi

java - InputStream 在 MessageBodyReader Jersey 中提供空数据

转载 作者:搜寻专家 更新时间:2023-11-01 02:38:16 26 4
gpt4 key购买 nike

我试图在 Jersey 的 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 的某种副作用。禁用此功能会导致上述代码正常工作。

有人可以帮忙吗?

最佳答案

显然有一个 HiddenHttpMethodFilter 在请求到达表单数据代码和 POST 请求之前执行 getParameter。所以 InputStream 已经被读取并且 br.readLine(); 正在返回 null

我在其他帖子中找到了一种方法来覆盖它 here

@Configuration
public class FilterConfig {
@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new HiddenHttpMethodFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
if ("POST".equals(request.getMethod())
&& request.getContentType().equals(MediaType.APPLICATION_FORM_URLENCODED)) {
//Skip this filter and call the next filter in the chain.
filterChain.doFilter(request, response);
} else {
//Continue with processing this filter.
super.doFilterInternal(request, response, filterChain);
}
}
};
}
}

所以它所做的只是检查请求是否为 POST 类型以及 MediaType 是否为 APPLICATION_FORM_URLENCODED,如果是则我们跳过这部分过滤器以其他方式为我们处理此过滤器的所有其他请求链接。

这样 InputStream 到达 MessageBodyReader 时就不会被读取了

关于java - InputStream 在 MessageBodyReader Jersey 中提供空数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40871054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com