Почему Джерси не разрешает одни и те же URL-адреса отдыха с разными методами Http? - PullRequest
0 голосов
/ 24 января 2019

API для получения клиента:

@Path("/{customerId}")
@GET
@Consumes({"application/json"})
@Produces({"application/json"})

API для обновления клиента:

@Path("/{customerId}")
@PUT
@Consumes({"application/json"})
@Produces({"application/json"})

API для удаления клиента:

@Path("/{customerId}")
@DELETE
@Consumes({"application/json"})
@Produces({"application/json"})

Примечание: тот же API в моем проекте весенней загрузки работает нормально.

В моем приложении Java EE (хотя у меня нет большого опыта работы с EE), Я получаю странные исключения, когда я добавляю эти apis:

[#|2019-01-24T18:00:25.698+0530|SEVERE|oracle-glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=419;_ThreadName=http-thread-pool-8080(3);|WebModule[]StandardWrapper.Throwable
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
    at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:771)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:766)
    at com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:488)
    at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:318)
    at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:609)
    at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210)
    at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:373)
    at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:556)
    at javax.servlet.GenericServlet.init(GenericServlet.java:244)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1453)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:1093)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:189)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    at com.sun.grizzly.arp.DefaultAsyncExecutor.execute(DefaultAsyncExecutor.java:159)
    at com.sun.grizzly.arp.DefaultAsyncExecutor.interrupt(DefaultAsyncExecutor.java:145)
    at com.sun.grizzly.arp.AsyncProcessorTask.doTask(AsyncProcessorTask.java:102)
    at com.sun.grizzly.http.TaskBase.run(TaskBase.java:193)
    at com.sun.grizzly.http.TaskBase.execute(TaskBase.java:175)
    at com.sun.grizzly.arp.DefaultAsyncHandler.handle(DefaultAsyncHandler.java:145)
    at com.sun.grizzly.arp.AsyncProtocolFilter.execute(AsyncProtocolFilter.java:210)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:745)

И

[#|2019-01-24T18:00:25.698+0530|WARNING|oracle-glassfish3.1.2|javax.enterprise.system.container.web.com.sun.enterprise.web|_ThreadID=419;_ThreadName=http-thread-pool-8080(3);|StandardWrapperValve[org.netbeans.rest.application.config.ApplicationConfig]: PWC1382: Allocate exception for servlet org.netbeans.rest.application.config.ApplicationConfig
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
    at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:771)

Любая помощь / объяснение приветствуется.

1 Ответ

0 голосов
/ 24 января 2019

Чтобы настроить конечную точку API REST в Java EE, создать класс и назвать его RestAppConfig или RestApplicationConfig, именование не имеет значения, и в коде должно быть следующее:

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

@ApplicationPath("/api")
public class RestAppConfig extends Application {

}

Класс может бытьempty.

Затем создайте класс, который определит все методы API:

import javax.ws.rs.GET;
import javax.ws.rs.Consumes;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;

@Path("customer")
public class MyAPI {

    @Path("{customerId}")
    @GET
    @Produces({"application/json"})
    public Response getCustomer(@PathParam("customerId") int customerId){
    ... 
    //define your other methods here
}

Тогда ваши методы API будут доступны через: / context / api / customer / {customerId}

Джерси определенно разрешает нескольким различным методам Http получать доступ к одному и тому же URL.

Если он все еще не работает или у вас уже была эта конфигурация, попробуйте удалить два метода, чтобы у вас остался только один,и попробуйте проверить это снова, это дает вам те же исключения?Тогда проблема может быть связана с сервером или реализацией, попробуйте заменить вашу зависимость от Джерси в вашем pom.xml.

Также, по соглашению, методы GET не должны ничего потреблять, в то время как методы PUT и DELETE не должныпроизводить что угодно.

...