2014-04-28 1 views
0

У меня проблема, с которой я действительно не могу избавиться. Я использую Glassfish 4.0, встроенный в Eclipse вместе с JAXB 2.2 и Jersey 2.0. Я хочу создать интерфейс REST, где функция, которую Джерси ожидает, ожидает двух параметров. Например, два параметра пути или смесь JAXB и один PathParameter. В любом случае, я всегда получаю исключение ModelValidationException с Джерси. Ввод только одного параметра в функцию отлично работает, но мне нужно как минимум два, а иногда и больше.Более двух параметров в функции REST приводят к ModelValidationException в Jersey 2.0/JAXB 2.2

Я нашел эту тему по этой теме Jersey 2 injection source for multipart formdata, но я думаю, что это не решение для меня, так как я работаю с GET, POST или даже PUT и не хочу использовать данные формы. В конце концов, я всегда получаю ту же ошибку, независимо от того, использую ли я PUT, POST или GET. Я, конечно, могу обойти эту проблему с помощью

@Context UriInfo info; 

информации и извлекать параметры пути, используя, например

long portID = new Long(uriInfo.getPathParameters().get("portid").get(0)); 

Кажется, я должен активировать определенную функцию через Glassfish, чтобы активировать эту функцию ,

Вот пример моего кода, который не workL

@PUT 
@Path("/networkelements/{neid: [0-9]+}/ports/clients/{portid: [0-9]+}") 
@Consumes(MediaType.APPLICATION_XML) 
public Response fullyUpdateClientPort(@PathParam("neid") long neID, @PathParam("portid") long portID, Ports ports){ 
    // TODO: Implement REST functionality 
    return Response.status(Response.Status.OK).entity("Port(s) fully updated").build(); 
} 

Пример, который прекрасно работает:

@GET 
@Path("/networkelements/{neid: [0-9]+}/ports/clients/") 
@Produces(MediaType.APPLICATION_XML) 
public Ports getClientPorts(@PathParam("neid") Long neID){ 
    // TODO: Implement REST functionality 
    Ports ports = new Ports(); 
    for (AbstractPort port : this.data.getPortList()) { 
     DebugLogger.get().log(Level.INFO, port.getPortName()); 
    } 
    ports.setPorts(this.data.getPortList()); 
    return ports; 
} 

EDIT: Эти исключения я получаю

2014-04-28T17:16:21.811+0200|SEVERE: WebModule[/SDNController]StandardWrapper.Throwable 
java.lang.IllegalStateException: The resource configuration is not modifiable in this context. 
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257) 
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:205) 
at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:435) 
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:261) 
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167) 
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349) 
at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1583) 
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:1225) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:237) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188) 
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) 
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) 
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) 
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) 
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 
at java.lang.Thread.run(Thread.java:745) 

2014-04-28T17:16:21.811+0200|WARNING: StandardWrapperValve[de.dhbw_stuttgart.sdncontroller.core.services.restresources.ApplicationConfig]: Allocate exception for servlet de.dhbw_stuttgart.sdncontroller.core.services.restresources.ApplicationConfig 
java.lang.IllegalStateException: The resource configuration is not modifiable in this context. 
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:257) 
at org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:205) 
at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:435) 
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:261) 
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167) 
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349) 
at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1583) 
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:1225) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:237) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188) 
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191) 
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168) 
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189) 
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) 
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) 
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) 
at java.lang.Thread.run(Thread.java:745) 

EDIT № 2:

Я выяснил, что, к сожалению, мои параметры в URL-адресе не декодируются автоматически. Я много искал через Google, но я не узнал, если мне придется отдельно активировать что-то, что Джерси или Glassfish автоматически. Получение этих параметров через UriInfo отлично работает и является единственным обходным решением вплоть до настоящего времени.

+0

Что случилось? Выбрасывает ли исключение, возвращает 404? –

+0

Ах, извините ... забыли, что писать. – rieni

+0

Я добавил исключения сейчас – rieni

ответ

0

Это исключение составляет usually, когда возникает проблема с инициализацией API. Не обязательно с запросом, который вызывает исключение исключения.

Постарайтесь посмотреть общий журнал контейнера. Комментируйте столько же, сколько части инициализации, пока это не сработает. Попытайтесь подумать, есть ли какой-нибудь код, который выполняется во время инициализации.

+0

Давным-давно, но я стараюсь помнить. Проблема заключалась в том, что путь каким-то образом не принимал более одного параметра функции. Путь полностью в порядке, и я могу запросить параметр, явно запросив его. Вот как я работал над этим. – rieni

+0

К сожалению, мое исследование об этом закончено, и я больше не буду работать над этим, но так или иначе ... Хорошо знать, что кто-то смотрит на него. ;-) – rieni

Смежные вопросы