2014-09-30 6 views
0

Моего web.xml являетсяНевозможно понять отображение web.xml и пакет определения

<servlet> 
    <servlet-name>SwipeXBackendServices</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.mycompany.backend.webservices</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>SwipeXBackendServices</servlet-name> 
    <url-pattern>/webservices/*</url-pattern> 
</servlet-mapping> 

Почему отображение должно быть /webservices/* и не com.mycompany.backend.webservices/*.

Это мой вебсервис код

package com.swipex.backend.webservices; 

@Path("/Activation") 
public class Activation { 
    private static final Logger log = Logger.getLogger(Activation.class); 
    private DeviceDetails deviceDetailsTable = DeviceDetails.getInstance(); 

    @POST 
    @Path("Request") 
    @Consumes({ MediaType.APPLICATION_JSON }) 
    public Response post(JAXBElement<CDeviceDetails> device) { 

Edit: Junit Client Code

@Test 
    public void testPost() throws Exception { 
     /* 
     * Activate 
     */ 
     // Initialize Web Services 
     ClientConfig config = new DefaultClientConfig(); 
     Client client = Client.create(config); 

     // 
     // Activation Service 
     // 
     URI url = UriBuilder.fromUri(
       "http://" + SERVER + "/SwipeXBackEnd/Activation/Request") 
       .build(); 
     WebResource service = client.resource(url); 
     System.out.println(url); 
     // Get the data ready 
     CDeviceDetails newDevice = new CDeviceDetails(null, "mac id", "model", 
       "manufacturer", "androidVersion", Calendar.getInstance() 
         .getTime(), "buildID", "fingerPrint", "board", 
       "bootLoader", "hardware", "id", "product", "serial", Calendar 
         .getInstance().getTime(), Calendar.getInstance() 
         .getTime(), Globals.ACTIVE); 
     String deviceUniqueIdentity = service.type(MediaType.APPLICATION_JSON) 
       .post(String.class, newDevice); 
     assertNotNull(deviceUniqueIdentity); 
     System.out.println("Activation Passed " + deviceUniqueIdentity); 
+0

Как и все остальные JEE, его массовое проектирование с учетом многочисленных гипотетических ситуаций, когда 99,9% пользователей просто хотят связать класс и метод java с шаблоном URL. –

+0

Слава богу, кто-то согласен со мной .. Заставьте меня чувствовать себя глупым. – Siddharth

ответ

1

Url картина не имеет никакого отношения с вашей структурой пакета Java. В вашем случае вы сопоставили сервлет SwipeXBackendServices для прослушивания на '/webservices' url (например: http://localhost:8080/webservices/). то есть, когда запрос поступает для '/ webservices', он будет перенаправлен в ваш класс сервлетов SwipeXBackendServices.

А также ваши JAX-RS (остальные) класса 'активации' сопоставляется с URL '/активации' (например: http://localhost:8080/activation).

Mapping ВГД & класса:

/webservices ===> SwipeXBackendServices 
/activation ===> Activation 

Таким образом, не следует путать имя пакета с именем URL.

+0

В файле журнала каталогов я заметил, что эти классы были загружены 'class com.swipex.backend.webservices.Класс активации com.swipex.backend.webservices.Registration' – Siddharth

+0

Где находится URL-адрес, с которым он работает? Новые для веб-сервисов, следовательно, вопросы. – Siddharth

+0

http://stackoverflow.com/questions/26097993/where-do-i-verify-the-load-path-for-my-rest-webservice. Пожалуйста помоги. – Siddharth

1

Как говорит Шрирам, сопоставления сервлетов не имеют отношения к пакетам.

Параметр com.sun.jersey.config.property.packages для сервлета SwipeXBackendServices просто сообщает Джерси, какой пакет сканирует для обнаружения ресурсов REST.

servlet-mapping для сервлета SwipeXBackendServices сообщает контейнеру сервлетов, на какие URL-адреса сервлет будет отвечать. В этом случае он будет отвечать на все URL-адреса с префиксом /webservices. Это означает, что все ресурсы REST будут иметь префикс /webservices.

Затем URL-адреса для любого REST ресурса будет конкатенация

  • Контекст WAR корня
  • Джерси отображение сервлета
  • Путь REST ресурс (будучи сама конкатенация пути в класса и путь методы;)

Таким образом, предполагая, что корень контекста для вашей WAR является /myWebApp, то URL для POST запроса на йо ur Activation ресурс будет: http://localhost:8080/myWebApp/webservices/Activation/Request

+0

Итак, у меня есть '<имя сервлета> SwipeXBackEnd/', и я назвал 'http: // localhost: 8080/SwipeXBackEnd/Activation/Request'. Я все еще получаю 404 – Siddharth

+0

Является ли 'SwipeXBackEnd' корнем контекста для вашего веб-приложения? Попробуйте, возможно, '/ *' вместо '/' для шаблона. Также обратите внимание, что отвечает только на запросы «POST», если вы пытаетесь использовать браузер, он по умолчанию отправляет запросы «GET». Вы можете попробовать добавить '@ GET' в свой метод для тестирования. – Benjamin