gpt4 book ai didi

java - @FormParameter在ContainerRequestContext实体流中读取并设置相同数据后数据变为null

转载 作者:行者123 更新时间:2023-11-30 02:19:12 25 4
gpt4 key购买 nike

我已经实现了过滤器,并且调用了 ContainerRequestContext 的 getEntityStream 并使用 setEntitystream 设置了确切的值。如果我使用此过滤器,那么 @FormParameter 数据将变为空,如果我不使用过滤器,那么一切都会好起来(因为我没有调用 getEntityStream),并且我必须使用过滤器来捕获请求数据。

注意:我从 MultivaluedMap formParams 获取表单参数,而不是从 @FormParameter 获取表单参数。

环境:- 使用 Jboss Wildfly 8 服务器的 Rest Easy API。

            @Provider
@Priority(Priorities.LOGGING)
public class CustomLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter{

final static Logger log = Logger.getLogger(CustomLoggingFilter.class);

@Context
private ResourceInfo resourceInfo;

@Override
public void filter(ContainerRequestContext requestContext)
throws IOException {
MDC.put("start-time", String.valueOf(System.currentTimeMillis()));

String entityParameter = readEntityStream(requestContext);

log.info("Entity Parameter :"+entityParameter);
}

private String readEntityStream(ContainerRequestContext requestContext){
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
final InputStream inputStream = requestContext.getEntityStream();
final StringBuilder builder = new StringBuilder();

int read=0;
final byte[] data = new byte[4096];
try {
while ((read = inputStream.read(data)) != -1) {
outStream.write(data, 0, read);
}
} catch (IOException e) {
e.printStackTrace();
}

byte[] requestEntity = outStream.toByteArray();
if (requestEntity.length == 0) {
builder.append("");
} else {
builder.append(new String(requestEntity));
}
requestContext.setEntityStream(new ByteArrayInputStream(requestEntity) );
return builder.toString();
}
return null;
}
}



class customResource
{

//// This code is not working
@POST
@Path("voiceCallBack")
@ApiOperation(value = "Voice call back from Twilio")
public void voiceCallback(@FormParam("param") String param)
{
log.info("param:" + param);
}

// This code is working

@POST
@Path("voiceCallBackMap")
@ApiOperation(value = "Voice call back from Twilio")
public void voiceCallbackMap(final MultivaluedMap<String, String> formParams)
{
String param = formParams.getFirst("param");
}
}

请建议我解决方案并提前致谢。

最佳答案

我在运行时发现实体流的实例(来自http请求)的类型为org.apache.catalina.connector.CoyoteInputStream(我正在使用jboss-as-7.1.1.Final)。但是我们正在使用 java.io.ByteArrayInputStream 的实例设置实体流。因此 Resteasy 无法绑定(bind)单独的表单参数。

对此有两种解决方案,您可以使用其中任何一种:

  1. 使用此方法 How to read JBoss Resteasy's servlet request twice while maintaing @FormParam binding?
  2. 获取表单参数,如下所示:
     @POST
@Path("voiceCallBackMap")
@ApiOperation(value = "Voice call back from Twilio")
public void voiceCallbackMap(final MultivaluedMap<String, String> formParams)

{
String param = formParams.getFirst("param");
}

关于java - @FormParameter在ContainerRequestContext实体流中读取并设置相同数据后数据变为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47349109/

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