簡體   English   中英

Jersey JAXRS過濾器,在命中資源(Web服務)之前提供解組實體

[英]Jersey JAXRS filter that provides unmarshalled entity before hitting resource (web service)

是否有一種優雅的方式(過濾器,鈎子)來攔截澤西島中的一個解組實體(及其注釋),然后才能點擊Web服務資源方法 - 那些用@ POST,@ PUT注釋的方法。

我真的需要實體本身及其上的任何注釋,然后使用驗證器注釋的屬性對該實體執行驗證(看起來像JSR 303,但我們不使用元數據注釋整個bean)。 從資源的實現角度來看,我的目標是能夠在資源方法中鍵入它:

@Path("/people")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public class PeopleService {
        @POST
        public Response createPerson(@CustomValidator("personValidator") Person person) throws URISyntaxException {
            String uri = someService.createPerson(person);
            return Response.created(new URI(uri)).entity(uri).build();
        }
    }

我開始編寫自定義MessageBodyReader的路徑,並設法讓JSON完全正常工作,因為我只是委托給ObjectMapper來反序列化JSON。 除此之外,我交給參數的注釋,事情很完美。 但是,當我需要反序列化XML時,事情就崩潰了。 我不知道如何獲得Jersey會使用的原始解串器並委托給它。 我也覺得我不必要地重寫Jersey的一部分,並且如果jersey在MessageBodyReader之后有一個層並且在實現之前調用了允許自己擴展的web資源服務,那么我寧願停止使用MessageBodyReader作為hacky集成點。可以為流添加自定義行為。

最終,澤西島有沒有任何擴展點,它可以交給我解組實體及其任何參數anntotations,並允許我進行自定義處理? 或者我是否必須弄清楚如何自己解組實體(使用JAXBContext或不使用)? 可能訴諸AOP? 將驗證器注入資源類並放棄該注釋想法?

澤西版:1.5

最終,澤西島有沒有任何擴展點,它可以交給我解組實體及其任何參數anntotations,並允許我進行自定義處理?

是的,在Jersey 1.x中有一個SPI,您可以在其中提供自己的方法調用程序。 我還沒有實現SPI,但我的理解是它在任何MessageBodyReaders或過濾器之后被調用。 看一下ResourceMethodCustomInvokerDispatchProvider 來自Javadocs:

實現(服務提供者)通過在資源目錄META-INF / services中放置提供者配置文件(如果尚未存在),“com.sun.research.ws.rest.spi.invoker.ResourceMethodCustomInvokerDispatchProvider”來標識自己,並在文件中包含實現的完全限定的service-provider-class。

此接口類似於ResourceMethodDispatchProvider,但允許使用自定義JavaMethodInvoker實例,該實例將用於進行最終的Java方法調用。

如果實現ResourceMethodCustomInvokerDispatchProvider,您應該能夠提供自己的JavaMethodInvoker ,它可以訪問被調用的資源方法,包括其所有參數和注釋。

請注意,以上所有內容均適用於Jersey 1.x. 在Jersey 2中,ResourceMethodInvocationHandlerProvider提供類似的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM