Servlets in Maven - maven

In the Maven Webapp project, I created the servlet DiaServlet in the root directory of the project, i.e., the directory where pom.xml is.
Its description in web.xml is as follows:
<servlet>
<servlet-name>DiaServlet</servlet-name>
<servlet-class>DiaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DiaServlet</servlet-name>
<url-pattern>/DiaServlet</url-pattern>
</servlet-mapping>
To this, I am getting the error:
java.lang.ClassNotFoundException: DiaServlet
One thing I tried is changing <servlet-class> tag to
<servlet-class>Prj.base.DiaServlet</servlet-class>
Here, Prj.base is the groupId of the project in the pom.xml file-- if this would be any concern(?)
<groupId>Dia.base</groupId>
The same servlet web.xml definition worked as is in a "non-Maven" web application.
When I created the servlet (I'm using NetScape), the servlet description wasn't added to the web.xml file although I'd checked to add it automatically.
Is this a problem of the build environment, or my servlet definition in web.xml (if so, how come the same definition worked in the other web application?) or something else?
new to Maven
TIA

You are a maven user, at the time of initialization of your project, you are giving package name as Dia.base, so your classes are resides in the Dia.base package only
So,
<servlet>
<servlet-name>DiaServlet</servlet-name>
<servlet-class>Dia.base.DiaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DiaServlet</servlet-name>
<url-pattern>/DiaServlet</url-pattern>
</servlet-mapping>
you need to give the fully qualified class name in the <servlet-class>

Related

Spring container is looking at wrong path while loading multiple spring configuration files

We are using Spring framework in the project. I am loading applicationContext file from web.xml in the following way:
<servlet>
<servlet-name>SpringDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/CustomerService/applicationContext.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringDispatcherServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
I am trying to load one configuration file JobDesigner-springintegration.xml inside the applicationContext file in the following way:
<import resource="JobDesigner-springintegration.xml"/>
Now, I am trying to load few more configuration files inside the
`JobDesigner-springintegration.xml` file in the following manner:
<import resource="*.xml"/>
But weirdly the spring container is looking in a wrong path something like below:
jndi:/localhost/cciupg/WEB-INF/CustomerService/
The log excerpts is shown below:
12:52:15,202 INFO [STDOUT] 12:52:15,202 INFO [XmlBeanDefinitionReader] Loading XML bean definitions from ServletContext resource [/WEB-INF/CustomerService/JobDesigner-springintegration.xml]
12:52:15,453 INFO [STDOUT] 12:52:15,448 WARN [PathMatchingResourcePatternResolver] Cannot search for matching files underneath URL [jndi:/localhost/cciupg/WEB-INF/CustomerService/] because it does not correspond to a directory in the file system
java.io.FileNotFoundException: URL [jndi:/localhost/cciupg/WEB-INF/CustomerService/] cannot be resolved to absolute file path because it does not reside in the file system: jndi:/localhost/cciupg/WEB-INF/CustomerService/
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:205)
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52)
at org.springframework.core.io.UrlResource.getFile(UrlResource.java:169)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.doFindPathMatchingFileResources(PathMatchingResourcePatternResolver.java:526)
at org.springframework.web.context.support.ServletContextResourcePatternResolver.doFindPathMatchingFileResources(ServletContextResourcePatternResolver.java:92)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(PathMatchingResourcePatternResolver.java:347)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources(PathMatchingResourcePatternResolver.java:279)
at org.springframework.context.support.AbstractApplicationContext.getResources(AbstractApplicationContext.java:1269)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:208)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:261)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:197)
at org.springframework.beans.factory.xml.DefaultBeanDe
The question here is why the spring container is looking at wrong path jndi:/localhost/cciupg/WEB-INF/CustomerService/ instead of /WEB-INF/CustomerService/?
And the weird part is why it is appending jndi:/localhost/cciupg to the path?
WEB-INF is not part of the classpath I believe. Therefore it cannot find the your *.xml files. I believe jndi is likely the last location spring has checked when throwing the error after looking down the classpath.
In other words, try putting your files in the classpath. In java projects I usually see resources in the main -> resources path.

Idea tomcat run configuration cannot find xml files of spring

I am using local tomcat server run configuration in idea. My code works just fine if I deploy it to the server through manager. However if I run it on idea it gives the following error :
java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]
I have this setting in web.xml :
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
I have my mvc-dispatcher-servlet.xml in src/main/webapp/WEB-INF folder. What could be causing this?
Spring MVC looks for a file named [servlet-name]-servlet.xml in the WEB-INF directory of your web application and creates the beans defined there, overriding the definitions of any beans defined with the same name in the global scope.
See this link
The file name must be mvc-dispatcher-servlet.xml and not mvc-dispather-servlet.xml.

Spring-ws on Weblogic: MessageDispatcherServlet doesn't have a default constructor

I'm trying to deploy a war containing spring webservices. But I am getting a weird error like this:
following error weblogic.application.ModuleException: [HTTP:101216]Servlet: "spring-ws" failed to preload on startup in Web application: "myApp-1.0.0-SNAPSHOT.war".
javax.servlet.ServletException: Servlet class: 'org.springframework.ws.transport.http.MessageDispatcherServlet' doesn't have a default constructor
at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:261)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.StubSecurityHelper.createServlet(StubSecurityHelper.java:64)
at weblogic.servlet.internal.StubLifecycleHelper.createOneInstance(StubLifecycleHelper.java:58)
at weblogic.servlet.internal.StubLifecycleHelper.<init>(StubLifecycleHelper.java:48)
at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:539)
at weblogic.servlet.internal.WebAppServletContext.preloadServlet(WebAppServletContext.java:1976)
at weblogic.servlet.internal.WebAppServletContext.loadServletsOnStartup(WebAppServletContext.java:1950)
I've tried giving a default constructor in the endpoint class.
Below are the steps which I followed:
web.xml has this entry:
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-ws</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
web-inf folder has spring-ws-servlet.xml file which has the entries for component scan, enabling the annotations and the wsdl entry like this:
<sws:static-wsdl id="MyService"
location="classpath:/services/myService/1.0/MyService.wsdl" />
Please let me know if I'm missing anything here....
Thank you.
It is likely that the jar files Weblogic is using to initialize the Spring classes and those expected to be used are in conflict.
To force the Weblogic container to use the jar files bundled with the war file you have to specify a WEB-INF/weblogic.xml file with the following content
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
see this thread

Forcing JBoss AS 7 to use static files from source (development) directory in Spring project

I want to speed up development cycle: read/write code, build, deploy, test by eliminating build and deploy stage for such file types:
CSS (.css)
JavaScript (.js)
images (.png, .jpg, .gif)
as CSS/JS/img are static files (does not require build stage) and I hope that JBoss can scan for file timestamp changes to update static file cache.
I have such code in web.xml:
<servlet>
<servlet-name>resources</servlet-name>
<servlet-class>org.springframework.web.servlet.ResourceServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>resources</servlet-name>
<url-pattern>/js/**</url-pattern>
<url-pattern>/css/**</url-pattern>
<url-pattern>/images/**</url-pattern>
</servlet-mapping>
So I need change it to something that also give full path to CSS/JS/imgs, like ~/devel/$proj/src/main/webapp. Also I think that static content may be served by JBoss itself instead of Spring.
As summary: how to configure Java EE project with JBoss AS 7 to serve static files from selected (in my case development) directory, while other files deployed as usual through .war file (I deploy by mvn -DskipTests=true package jboss-as:deploy)?
After spending 4 hours I make it work! But not in general case because solution based on new Spring 3.x series.
For general case solution you must implement own servlet, like this done n famous blog article: http://balusc.blogspot.com/2009/02/fileservlet-supporting-resume-and.html
I don't like to write code but like to configure already prebuild components!
So first I change request handler for all URL to org.springframework.web.servlet.DispatcherServlet:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Before I have:
<url-pattern>*.htm</url-pattern>
<url-pattern>*.xml</url-pattern>
so *.js, *.css, *.png files managed by default container (JBoss) servlet and any options further have no effect...
Next I use Spring 3.0 features <mvc:resources> (xmlns:mvc="http://www.springframework.org/schema/mvc") and file: resource type:
<mvc:resources mapping="/css/**" location="file:/home/user/devel/proj/src/main/webapp/css/"/>
<mvc:resources mapping="/images/**" location="file:/home/user/devel/proj/src/main/webapp/images/"/>
<mvc:resources mapping="/js/**" location="file:/home/user/devel/proj/src/main/webapp/js/"/>
Any time I save .js or .css file and refresh web-page in browser I get new content!
So reduce static content deploy time from 2 minute to 1 second!!!
UPDATE After switching to Tomcat 7 I configure context /opt/apache-tomcat-7.0.40/conf/Catalina/localhost/CTXNAME.xml:
<Context docBase="/home/user/devel/proj-dev/src/main/webapp"
reloadable="true">
<Resources className="org.apache.naming.resources.VirtualDirContext"
extraResourcePaths="/WEB-INF/classes=/home/user/devel/proj-dev/target/classes,/WEB-INF/lib=/home/user/devel/proj-dev/target/proj/WEB-INF/lib"/>
<Loader className="org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath="/home/user/devel/proj-dev/target/classes;/home/user/devel/proj-dev/target/proj/WEB-INF/lib"/>
<JarScanner scanAllDirectories="true"/>
</Context>
according to:
http://tomcat.apache.org/tomcat-7.0-doc/config/context.html
http://tomcat.apache.org/tomcat-7.0-doc/config/resources.html
http://tomcat.apache.org/tomcat-7.0-doc/config/loader.html
Now JS/CSS/JSP files update by F5 in browser. In order to use new .class invoke mvn compile. To bootstrap invoke mvn package

serve static resource using spring 3.0.0 and tomcat

I need to expose some static content (xsd files that are required by the wsdl). I cannot use the mvn:resources since it is not available in Spring 3.0.0
I don't have an idea as to where the static content should go. Hope someone can help me.
In my web.xml i have
<servlet>
<servlet-name>Resources</servlet-name>
<servlet-class>org.springframework.web.servlet.ResourceServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Resources</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>
then in the webapp dir I added a resources dir with the static files.
% ls webapp
index.jsp META-INF resources WEB-INF
can someone tell me where the static content should go.
thanks much.
Dont forget this one aswell:
<!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource
requests to the container's default Servlet -->
<mvc:default-servlet-handler/>
You wrote
I cannot use the mvn:resources since it is not available in Spring 3.0.0
This is complete wrong!
mvn:resources is avaiable in Spring mvc namespace for version 3.0.0 3.0.4
See the xsd: http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

Resources