I am using Jersey and Tomcat and I am getting the following message whenever I click a link:
HTTP Status 500 - The servlet context path and/or the servlet path contain
characters that are percent encoded
type: Exception report
message: The servlet context path and/or the servlet path contain characters
that are percent encoded
description: The server encountered an internal error that prevented it from
fulfilling this request.
exception:
javax.ws.rs.ProcessingException: The servlet context path and/or the servlet path
contain characters that are percent encoded
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:317)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note: The full stack trace of the root cause is available in the Apache Tomcat/7.0.56
logs.
The path to the REST service is:
http://localhost:8070/simple-service-webapp/rest/hello
When I type this into the URL bar it works, but when I click on a link somewhere on the way the URL becomes this:
http://localhost:8070/simple%2Dservice%2Dwebapp/rest/hello
And somehow Jersey does not deal with percent encoded URLs by default.
Can someone please help me get this to work without removing the dash in the URL? My search did not provide a working solution.
HelloResource.java
package com.example;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
@Path("hello")
public class HelloResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHelloPlainText(@Context UriInfo uriInfo) {
String name = uriInfo.getQueryParameters().getFirst("name");
if (name == null) {
name = "unknown user";
}
return "Hello " + name + "!";
}
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHelloHtml(@Context UriInfo uriInfo) {
String text = sayHelloPlainText(uriInfo);
String result = "<html>" + "<head>" + "<title>Hello Jersey</title>" + "</head>"
+ "<body>" + "<h1>" + text + "</h1>" + "</body>" + "</html>";
return result;
}
@GET
@Produces(MediaType.TEXT_XML)
public String sayHelloXml(@Context UriInfo uriInfo) {
String text = sayHelloPlainText(uriInfo);
String result = "<?xml version=\"1.0\"?>" + "<hello>Hello " + text + "!" + "</hello>";
return result;
}
}
index.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>RESTful Web Application</title>
</head>
<body>
<h2>My RESTful Web Application!</h2>
<ul>
<li><a href="rest/hello">Hello from Jersey</a></li>
<li><a href="rest/hello?name=Johannes">Hello using parameters</a></li>
</ul>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.example</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>simple-service-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>simple-service-webapp</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jersey.version>2.16</jersey.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>${jersey.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
</dependency>
</dependencies>
<build>
<finalName>simple-service-webapp</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<inherited>true</inherited>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.wildfly.plugins</groupId>
<artifactId>wildfly-maven-plugin</artifactId>
<version>1.0.2.Final</version>
<configuration>
<id>WildFlyServer</id>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<server>TomcatServer</server>
<url>http://localhost:8070/manager/text</url>
</configuration>
</plugin>
</plugins>
</build>
</project>
I ran into this exact problem. Change your artifact id to something like "SimpleWebApp" (note that I took out the '-') and it works. For what I wanted to do, it was not worth finding out the exact reason why this would not work. I don't think it is jersey, but something about tomcat.
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=SimpleWebapp -Dpackage=com.example \
-DarchetypeVersion=2.22.1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With