[undertow-dev] ServletContext.getResource() and FileNotFound
Tomaž Cerar
tomaz.cerar at gmail.com
Wed Nov 12 07:47:01 EST 2014
I think you are missing configuration for resourceManager, as if not set it
defaults to empty resource manager.
add something like this to getDeploymentInfo
ResourceManager resourceManager = new
ServletResourceManager(deploymentRoot, overlays, explodedDeployment);
//this is not needed, but it good for performance
resourceManager = new CachingResourceManager(100, 10 * 1024 * 1024,
servletContainer.getBufferCache(), resourceManager, explodedDeployment
? 2000 : -1);
deploymentInfo.setResourceManager(resourceManager);
--
tomaz
On Wed, Nov 12, 2014 at 10:56 AM, Davide Ungari <ungarida at gmail.com> wrote:
> Hi,
> I'm using version 1.1.0.CR8.
>
> --
> Davide
>
> On Wed, Nov 12, 2014 at 8:47 AM, Davide Ungari <ungarida at gmail.com> wrote:
>
>> Hi everybody,
>> I'm trying to migrate my webapp from Jetty to Undertow.
>>
>> The stack is composed by Undertow Guice and Struts2.
>>
>> I developed the following class to configure undertow:
>>
>> package com.billdrawer.website.server;
>>>
>>> import io.undertow.Undertow;
>>> import io.undertow.predicate.Predicates;
>>> import io.undertow.server.HandlerWrapper;
>>> import io.undertow.server.HttpHandler;
>>> import io.undertow.server.HttpServerExchange;
>>> import io.undertow.server.handlers.PathHandler;
>>> import io.undertow.server.handlers.PredicateHandler;
>>> import io.undertow.server.handlers.resource.ResourceHandler;
>>> import io.undertow.servlet.api.ConfidentialPortManager;
>>> import io.undertow.servlet.api.Deployment;
>>> import io.undertow.servlet.api.DeploymentInfo;
>>> import io.undertow.servlet.api.DeploymentManager;
>>> import io.undertow.servlet.api.FilterInfo;
>>> import io.undertow.servlet.api.ListenerInfo;
>>> import io.undertow.servlet.api.LoginConfig;
>>> import io.undertow.servlet.api.SecurityConstraint;
>>> import io.undertow.servlet.api.ServletContainer;
>>> import io.undertow.servlet.api.WebResourceCollection;
>>>
>>> import java.net.URL;
>>> import java.nio.file.Files;
>>> import java.nio.file.Paths;
>>> import java.util.EnumSet;
>>>
>>> import javax.inject.Inject;
>>> import javax.inject.Named;
>>> import javax.servlet.DispatcherType;
>>> import javax.servlet.ServletContext;
>>> import javax.servlet.ServletException;
>>>
>>> import org.apache.log4j.Logger;
>>> import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
>>> import org.keycloak.adapters.AdapterConstants;
>>> import org.keycloak.adapters.undertow.KeycloakServletExtension;
>>>
>>> import com.billdrawer.website.common.Config;
>>> import com.billdrawer.website.listener.WebsiteServletContextListener;
>>> import com.google.inject.servlet.GuiceFilter;
>>>
>>> public class UndertowServer implements Server {
>>> private Logger _logger = Logger.getLogger(UndertowServer.class);
>>> private Undertow _server;
>>> private DeploymentManager _manager;
>>> private int _port;
>>> private String _host;
>>>
>>> @Inject
>>> public UndertowServer(@Named(Config.STAGE) String stage, @Named(Config.SERVER_HOST) String host, @Named(Config.SERVER_PORT) int port,
>>> @Named(Config.SERVER_TIMEOUT) int timeout) {
>>> _port = port;
>>> _host = host;
>>>
>>> DeploymentInfo deploymentInfo = getDeploymentInfo(stage);
>>>
>>> ServletContainer _container = ServletContainer.Factory.newInstance();
>>> _manager = _container.addDeployment(deploymentInfo);
>>> _manager.deploy();
>>>
>>> Deployment deployment = _manager.getDeployment();
>>>
>>> KeycloakServletExtension keycloak = new KeycloakServletExtension();
>>> deploymentInfo.addServletExtension(keycloak);
>>> deploymentInfo.addInitParameter(AdapterConstants.AUTH_DATA_PARAM_NAME, getKeyloakJson());
>>> keycloak.handleDeployment(deploymentInfo, _manager.getDeployment().getServletContext());
>>>
>>> final ServletContext servletContext = deployment.getServletContext();
>>> _logger.debug("Context initialized:"+servletContext.getContextPath());
>>> }
>>>
>>> protected String getKeyloakJson() {
>>> String keycloak = "";
>>> URL url = getClassLoader().getResource("keycloak.json");
>>> if (url != null) {
>>> try {
>>> byte[] encoded = Files.readAllBytes(Paths.get(url.toURI()));
>>> keycloak = new String(encoded, "utf-8");
>>> } catch (Exception e) {
>>> _logger.error("Can't read keycloak.json", e);
>>> }
>>> }
>>> return keycloak;
>>> }
>>>
>>> protected DeploymentInfo getDeploymentInfo(String stage) {
>>> final DeploymentInfo deploymentInfo = new DeploymentInfo();
>>> deploymentInfo.setClassLoader(getClassLoader());
>>> deploymentInfo.setContextPath("/");
>>> deploymentInfo.setDefaultEncoding("UTF-8");
>>> deploymentInfo.setDeploymentName("website.war");
>>> deploymentInfo.setDisplayName("WebsiteServer");
>>> deploymentInfo.setUrlEncoding("UTF-8");
>>>
>>> deploymentInfo.addListener(new ListenerInfo(WebsiteServletContextListener.class));
>>>
>>> FilterInfo guiceFilter = new FilterInfo("GuiceFilter", GuiceFilter.class);
>>> deploymentInfo.addFilter(guiceFilter);
>>> for (DispatcherType dispatcher : EnumSet.allOf(DispatcherType.class)) {
>>> deploymentInfo.addFilterUrlMapping(guiceFilter.getName(), "/*", dispatcher);
>>> }
>>>
>>> FilterInfo strutsPrepareAndExecuteFilter = new FilterInfo("StrutsFilter", StrutsPrepareAndExecuteFilter.class);
>>> deploymentInfo.addFilter(strutsPrepareAndExecuteFilter);
>>> for (DispatcherType dispatcher : EnumSet.allOf(DispatcherType.class)) {
>>> deploymentInfo.addFilterUrlMapping(strutsPrepareAndExecuteFilter.getName(), "/*", dispatcher);
>>> }
>>>
>>> deploymentInfo.addInitialHandlerChainWrapper(new HandlerWrapper() {
>>> @Override
>>> public HttpHandler wrap(final HttpHandler handler) {
>>> final ResourceHandler resourceHandler = new ResourceHandler(deploymentInfo.getResourceManager());
>>> PredicateHandler predicateHandler = new PredicateHandler(Predicates.suffixes(".css",".html",".js"),resourceHandler, handler);
>>> return predicateHandler;
>>> }
>>> });
>>>
>>> configureSecurity(deploymentInfo);
>>>
>>> return deploymentInfo;
>>> }
>>>
>>> protected void configureSecurity(DeploymentInfo deploymentInfo) {
>>> deploymentInfo.setLoginConfig(new LoginConfig("KEYCLOAK", "billdrawer"));
>>> deploymentInfo.setConfidentialPortManager(new ConfidentialPortManager() {
>>> @Override
>>> public int getConfidentialPort(HttpServerExchange exchange) {
>>> return _port;
>>> }
>>> });
>>> SecurityConstraint securityConstraint = new SecurityConstraint();
>>> WebResourceCollection webResourceCollection = new WebResourceCollection();
>>> webResourceCollection.addUrlPattern("/dashboard/*");
>>> securityConstraint.addWebResourceCollection(webResourceCollection);
>>> securityConstraint.addRoleAllowed("user");
>>> deploymentInfo.addSecurityConstraint(securityConstraint);
>>> }
>>>
>>> protected ClassLoader getClassLoader() {
>>> return getClass().getClassLoader();
>>> }
>>>
>>> public void start() {
>>> _logger.debug("starting...");
>>> try {
>>> Undertow.Builder builder = Undertow.builder();
>>> builder.addHttpListener(_port, _host);
>>>
>>> final PathHandler rootHandler = new PathHandler();
>>> rootHandler.addPrefixPath(_manager.getDeployment().getDeploymentInfo().getContextPath(), _manager.start());
>>>
>>> builder.setHandler(rootHandler);
>>> _server = builder.build();
>>> _server.start();
>>> } catch (ServletException e) {
>>> _logger.error("Unexpected exception", e);
>>> }
>>> _logger.info("###START###");
>>> }
>>>
>>> public void stop() {
>>> _logger.debug("stopping...");
>>> try {
>>> _manager.stop();
>>> _server.stop();
>>> } catch (ServletException e) {
>>> _logger.error("Unexpected exception", e);
>>> }
>>> _logger.info("###STOP###");
>>> }
>>> }
>>>
>>> Everything is working until I do not try to load resources from context.
>> I need some help before rollback to Jetty :(
>>
>> --
>> Davide
>>
>
>
> _______________________________________________
> undertow-dev mailing list
> undertow-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/undertow-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20141112/50d9e28d/attachment.html
More information about the undertow-dev
mailing list