Problem using XtextServlet in SpringBoot Application [message #1719826] |
Tue, 12 January 2016 11:28 |
Cornelius Mueller Messages: 1 Registered: January 2016 |
Junior Member |
|
|
Hi,
i am trying to integrate the XtextServlet in my SpringBoot application for the web integration of my DSL.
During my request to the server i get an error from the XtextServlet:
java.lang.IllegalStateException: STREAMED
at org.eclipse.jetty.server.Request.getReader(Request.java:979) ~[jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at javax.servlet.ServletRequestWrapper.getReader(ServletRequestWrapper.java:266) ~[javax.servlet-api-3.1.0.jar:3.1.0]
at org.eclipse.xtext.web.servlet.HttpServiceContext.initializeParameters(HttpServiceContext.java:91) ~[org.eclipse.xtext.web.servlet-2.9.0.jar:na]
at org.eclipse.xtext.web.servlet.HttpServiceContext.<init>(HttpServiceContext.java:43) ~[org.eclipse.xtext.web.servlet-2.9.0.jar:na]
at org.eclipse.xtext.web.servlet.XtextServlet.getService(XtextServlet.java:216) ~[org.eclipse.xtext.web.servlet-2.9.0.jar:na]
at org.eclipse.xtext.web.servlet.XtextServlet.doPut(XtextServlet.java:136) ~[org.eclipse.xtext.web.servlet-2.9.0.jar:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) ~[javax.servlet-api-3.1.0.jar:3.1.0]
at org.eclipse.xtext.web.servlet.XtextServlet.service(XtextServlet.java:60) ~[org.eclipse.xtext.web.servlet-2.9.0.jar:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[javax.servlet-api-3.1.0.jar:3.1.0]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812) ~[jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) ~[jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:224) ~[websocket-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:84) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) [jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) [jetty-security-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) [jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.Server.handle(Server.java:499) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544) [jetty-io-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) [jetty-util-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) [jetty-util-9.2.14.v20151106.jar:9.2.14.v20151106]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]
There is an error in java.io.BufferedReader getReader() - if getInputStream() method has been called on this request.
getInputStream() is called before from the DispatcherServlet from SpringBoot.
Do you have an idea how to avoid this error or a hint for a correct Spring Boot implementation?
Thanks in advance!
(xtext version 2.9.0)
[Updated on: Wed, 13 January 2016 01:13] Report message to a moderator
|
|
|
|
Re: Problem using XtextServlet in SpringBoot Application [message #1746933 is a reply to message #1720050] |
Mon, 07 November 2016 19:08 |
Anthony Mising name Messages: 4 Registered: November 2010 |
Junior Member |
|
|
Hi,
I've been trying to get the same thing to work today. I got the same error as described. It looks like the servlet specification does not permit calling request.getReader() more than once.
It turns out that spring auto configures filters into the web context. One of the filters OrderedHttpPutFormContentFilter makes a call request.getReader() method causing the invalid state when the Xtext Servlet also subsequently makes the same call.
To get around this I've disabled the filters: OrderedHttpPutFormContentFilter and HiddenHttpMethodFilter.
Here is the code I used.
package org.xtext.example.mydsl.web;
import java.util.ArrayList;
import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.webapp.AbstractConfiguration;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory;
import org.springframework.boot.web.filter.OrderedHttpPutFormContentFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.HiddenHttpMethodFilter;
@Component
public class SpringBootJetty implements BeanFactoryPostProcessor {
@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
JettyEmbeddedServletContainerFactory jettyContainer = new JettyEmbeddedServletContainerFactory();
jettyContainer.setPort(8080);
return jettyContainer;
}
@Bean
public FilterRegistrationBean registration1(OrderedHttpPutFormContentFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
@Bean
public FilterRegistrationBean registration2(HiddenHttpMethodFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory bf)
throws BeansException {
// You can iterate through all the filters and disable.....
// DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) bf;
//
// Arrays.stream(beanFactory.getBeanNamesForType(javax.servlet.Filter.class))
// .forEach(name -> {
//
// BeanDefinition definition = BeanDefinitionBuilder
// .genericBeanDefinition(FilterRegistrationBean.class)
// .setScope(BeanDefinition.SCOPE_SINGLETON)
// .addConstructorArgReference(name)
// .addConstructorArgValue(new ServletRegistrationBean[]{})
// .addPropertyValue("enabled", false)
// .getBeanDefinition();
//
// beanFactory.registerBeanDefinition(name + "FilterRegistrationBean",
// definition);
// });
}
@Bean
public ServletRegistrationBean xtextServletRegistrationBean() {
ServletRegistrationBean bean = new ServletRegistrationBean(new MyDslServlet(), "/xtext-service/*");
bean.setName("XtextService");
bean.setOrder(ServletRegistrationBean.HIGHEST_PRECEDENCE);
bean.setOrder(100);
return bean;
}
}
Hope this gets you further on.
Cheers
Anthony
[Updated on: Mon, 07 November 2016 19:39] Report message to a moderator
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.02353 seconds