<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Configuration
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(HelloController.class);
register(MyFilter.class);
}
}
@Component
@Path("/hello")
public class HelloController {
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@POST
public String onHelloRequest(@FormParam("foo") String foo) {
System.out.println(foo);
return foo + "bar";
}
}
public class MyFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext ctx) throws IOException {
System.err.println("I'm in the filter");
// Solution #1 doesn't work
if (ctx instanceof ContainerRequest) {
ContainerRequest request = (ContainerRequest) ctx;
request.bufferEntity();
Form f = request.readEntity(Form.class);
System.err.println(f.asMap().toString());
}
// Solution #2 doesn't work either
InputStream inputStream = ctx.getEntityStream();
StringBuilder textBuilder = new StringBuilder();
try (Reader reader = new BufferedReader(new InputStreamReader
(inputStream, Charset.forName(StandardCharsets.UTF_8.name())))) {
int c = 0;
while ((c = reader.read()) != -1) {
textBuilder.append((char) c);
}
}
System.err.println(textBuilder.toString());
}
}
Spring-web有没有可能在调用Jersey之前消耗InputStream?
请帮帮我.
编辑
我的回答是
芭芭拉
我的控制台输出是
这里是“解决方案”
在SpringBoot中,如果添加starter-web模块,它将添加spring:webmvc,这似乎与JAXR和Servlet过滤器不兼容。如果您使用SpringBoot和Jersey,请确保webmvc jar不在类路径上。
Spring堆栈将消耗servlet的请求InputStream,管道中的每个下行拦截器/过滤器将一无所获。
public MyFilter implements Filter
{
@Override
public final void doFilter(
final ServletRequest request,
final ServletResponse response,
final FilterChain chain)
throws IOException,
ServletException {
getRawFormPayload((HttpServletRequest) request);
chain.doFilter(request, response);
}
protected String getRawFormPayload(HttpServletRequest request) {
final int contentLength = request.getContentLength();
final StringBuilder payloadBuilder = new StringBuilder(contentLength);
try {
final InputStream inputStream = request.getInputStream();
final BufferedReader reader =
new BufferedReader(new InputStreamReader(inputStream, request.getCharacterEncoding()));
// Buffer should not be higher than the content-length of the request
reader.mark(contentLength + 1);
final char[] charBuffer = new char[contentLength + 1];
int bytesRead = -1;
while ((bytesRead = reader.read(charBuffer)) > 0) {
payloadBuilder.append(charBuffer, 0, bytesRead);
}
// Reset the buffer so the next Filter/Interceptor have unaltered InputStream
reader.reset();
} catch (final IOException e) {
this.LOG.error(e.getMessage(), e);
}
return payloadBuilder.toString();
}
}
我试图实现一个< code > ContainerRequestFilter 来检查一些东西。最终,它将从SSL客户机证书中提取通用名称,但我还没有做到这一点。过滤器运行在Grizzly HTTP服务器上(Grizzly 2.3.8,没有servlet容器),位于JAX-RS资源(Jersey 2.6)的前面。 当我尝试将注入过滤器时,它为null。 将请求注入到 JAX-RS 资源中,注入是成功
我的远程接口是: 我的EJB实现是: 每次当我调用实体方法getFileId()时, 编辑: 当我试图使用JPA2.0提供的方法访问实体的主键时: 我得到了同样的错误回报。烦人??
我正在用Spring Boot构建一个SOAP web服务。一个。wsdl文件是由第三方提供的,我正在用wsdl2java生成Java类。 当使用SoapUI进行测试时,我可以击中我的endpoint。但是,请求总是空的,除非我在SOAPUI中手动修改XML请求。 如何通过修改代码而不更改原始wsdl或XML请求来修复此问题?
问题内容: 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 该为空。我可以将上下文注入到被调用的实际端点中,但这相当粗陋和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端获取此对象。 必须有一种简单的方法来执行此操作。到目前为止,我所看到的所有问题/答案都不适用于Grizzly,也无法插入REST端点调
问题内容: 我正在尝试使用类似于以下内容的InputStream来执行POST: 在这种情况下,InputStream来自压缩的tar文件。 张贴InputStream的正确方法是什么? 问题答案: 我在这里想到的唯一解决方案是使用TypeFile类: 和接口(这次没有显式设置Content-Type标头): 使用我自己的TypedInput实现会导致模糊的EOF异常,即使我提供了length()
一个简单的页面: app\fetch-demo\page.js 浏览器控制台返回两次同样的结果: 为什么会这样?