JAX-RS: путь, заканчивающийся косой чертой (/), вызывает ошибку 404 - PullRequest
2 голосов
/ 14 февраля 2012

Попытка достичь ресурса на http://localhost:8080/enterprise/session/new/ приводит к ошибке HTTP 404 (не найдена).Попытки достичь того же ресурса на http://localhost:8080/enterprise/session/new работают, как и ожидалось.

Ресурс сеанса:

@GET
@Path("/new")
@Produces(MediaType.TEXT_HTML)
public Viewable newSession() {

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("method","secEnterprise");

    // create authentication form
    return new Viewable("/session/new", map);

}

Представление находится по адресу WEB-INF \ views \ session \ new.jsp

Я подозреваю, что часть проблемы связана сраздел web.xml:

<filter>
    <filter-name>jersey</filter-name>
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.businessobjects.resources</param-value>
    </init-param>        
    <init-param>
        <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
        <!-- is this capturing the '/' and redirecting it to a non-existent view (.JSP)? -->
        <param-value>/((WEB-INF/views))/.*</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
        <param-value>/WEB-INF/views/</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.feature.Redirect</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.feature.FilterForwardOn404</param-name>
        <param-value>true</param-value>
    </init-param>        
</filter>

<filter-mapping>
    <filter-name>jersey</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Я не уверен, что это связано, но форма представления POSTs для / session / session, а не просто для / session:

<!-- new.jsp -->
...
<form method="post" action="session">
...

Что мне не хватает?

** edit 0 **

Изменение атрибута действия элемента формы на

<form method="post" action="/enterprise/session">

работает как положено.Тем не менее, завершающий слеш:

<form method="post" action="/enterprise/session/">

приводит к той же ошибке, упомянутой ранее.

Похоже, что выражение регулярного выражения /((WEB-INF/views))/.* необходимо изменить, чтобы игнорировать завершающие слеши ('/').

** edit 1 **

У меня есть корневой ресурс:

@Path("/")
public class HomeResource {

    @GET
    public Response index() {
        return Response.ok(new Viewable("/home/index")).build();
    }
}

Запросы на http://localhost:8080/enterprise автоматически направляются на http://localhost:8080/enterprise/,, поэтому некоторые аспекты автоматического перенаправления работают правильно.

1 Ответ

1 голос
/ 14 февраля 2012

Не уверен, какую реализацию вы используете, но цитирование из документации Джерси:

Значение @Path может начинаться или не начинаться с '/', это не имеет значения.Аналогично, по умолчанию значение @Path может заканчиваться или не заканчиваться на '/', это не имеет значения, и, следовательно, запрашиваемые URL, которые заканчиваются или не заканчиваются на '/', будут совпадать.Однако в Джерси есть механизм перенаправления, который, если он включен, автоматически выполняет перенаправление на URL-адрес запроса, заканчивающийся на «/», если URL-адрес запроса не заканчивается на «/», а соответствующий @Path заканчивается на «/».

...