2013-03-22 1 views
2

Этот простой класс корневого ресурса не работает при работе на TomEE + 1.5.1, return - ошибка 404 "Запрошенный ресурс недоступен «. Он упакован как WAR с и пустой файл web.xml в WEB-INF.Веб-сервис JAX-RS с использованием @Path ("/") на уровне класса не работает на TomEE + 1.5.1

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.UriInfo; 


@Path("/") 
@Produces({ "text/plain", "text/html", "text/xml", "application/xml", "application/json" }) 
public class BrokenResource { 
    private static final Log logger = LogFactory.getLog(BrokenResource.class); 


    public BrokenResource() 
    { 
     logger.info("constructed"); 
    } 

    @GET 
    @Path("getloggedinguids") 
    public Response foo(@Context UriInfo uInfo) 
    { 
     return Response.ok("\n\n\nrequest URI = " + uInfo.getRequestUri()).build(); 
    } 
} 

Он разворачивает и я вижу эти строки в консоли вывода:

Mar 22, 2013 4:56:16 PM org.apache.openejb.server.rest.RESTService deployPojo 
INFO: REST Service: http://localhost:8080/test//* -> Pojo BrokenResource 

Я также пробовал упаковки его с web.xml, объявляющего:

<servlet> 
    <servlet-name>test</servlet-name> 
    <display-name>Test OpenEJBRest Servlet</display-name> 

    <servlet-class> 
     org.apache.openejb.server.rest.OpenEJBRestServlet 
    </servlet-class> 

    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>test</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Те же результаты, как с пустым файлом web.xml.

Я также попытался изменить @Path аннотацию уровня класса к @Path («*»), а затем я получаю другой ответ, в консоли вывода я вижу следующую строку:

WARNING: No root resource matching request path /test/getloggedinguids has been found, Relative Path: /getloggedinguids. 

Наконец .. если я изменю аннотацию @Path на что-то вроде @Path ("/ foo"), то это работает точно так, как ожидалось ... hit/test/foo/getloggedinguids возвращает URI запроса.

Я пытаюсь всевозможные вариации отображения сервлетов по сравнению с аннотациями уровня класса и одна вещь согласована ... аннотация @Path («/») на уровне класса всегда терпит неудачу.

Я даже взял пример из «RESTful Java с помощью JAX-RS book», который использует класс @Path («/») на уровне класса ... который также терпит неудачу.

Является ли это ошибкой в ​​реализации CXF стандарта JAX-RS? Мой проект требует, чтобы я использовал контейнер TomEE +, поэтому я не могу переключиться на другую реализацию JAX-RS :-(

ответ

1

Вместо добавления записей в web.xml, имейте в виду, что TomEE имеет встроенную поддержку JAX-RS . если вы используете JAX-RS или TomEE+ версии

Добавьте класс, как это и удалить свои записи web.xml:

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 


@ApplicationPath("/") 
public class NoteTakerApplication extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
     return new HashSet<Class<?>>(Arrays.asList(BrokenResource.class, RestExceptionMapper.class, OtherClassesYouMayHave.class)); 
    } 
} 
Смежные вопросы