簡體   English   中英

使用注釋修改 REST 參數 - Java EE8

[英]Modify REST parameters with annotation - Java EE8

我的目的是在 REST 方法中使用自定義注釋,以某種所需的形式自動轉換參數。 就像是:

Response get(@StringNormalizer(UPPERCASE) String myparam)

我知道有HttpServletRequestWrapper類可用於攔截和修改輸入 URI:

@WebFilter(urlPatterns="/*")
public class ApiOriginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
    {                       
        HttpServletRequest wrappedRequest = new MyWrappedRequest(request);
        chain.doFilter(wrappedRequest, response);
    }
}

public class MyWrappedRequest extends HttpServletRequestWrapper
{
    @Override
    public String getQueryString() {
        // return modified query
    }
}

但是我不知道如何檢索方法參數的注釋(在上面的例子中,它是StringNormalizer類)。

任何提示?

你有兩種方法可以做到這一點。 首先,對我來說最好的解決方案是使用Argument Resolver

參數解析器是一個實現HandlerMethodArgumentResolver接口的類。 您必須實現的抽象方法讓您可以獲取參數類型和參數可選注釋,並通過訪問原始數據來構建它。

然后,您應該擴展實現WebMvcConfigurer Configuration 類,並覆蓋addArgumentResolvers以將新創建​​的類包含到聲明為形式參數的列表中。

使用此配置,Spring 將自動為所有控制器攔截與您在 Argument Resolver 類中編寫的條件匹配的所有聲明參數,並將應用您開發的轉換邏輯。

實現您的目標的第二個解決方案是實現面向方面的編程,在這種情況下它是過度結構化的,但非常適合此類目的。 Spring 允許您使用 AspectJ 實現 Aspects。 正如我之前所說,我認為對您來說最好的解決方案是使用參數解析器。

這在標准 JAX-RS 中非常簡單。 您需要一個可以轉換參數的ContainerRequestFilter 就像是:

@Provider
@Priority(Priorities.USER)
public class RequestLoggingFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        UriInfo uriInfo = requestContext.getUriInfo();

        MultivaluedMap<String, String> pathParameters = uriInfo.getPathParameters();
        for( String nextKey: pathParameters.keySet() ) {
            List<String> oldValues = pathParameters.get(nextKey);
            List<String> newValues = new ArrayList<>();

            for (String nextValue : oldValues) {
                newValues.add(nextValue.toUpperCase());
            }
            // replace old parameters with new
            pathParameters.put(nextKey, newValues);
        }
    }
}

請注意,這會將每個路徑參數大寫。 如果這不是您想要的,您將需要檢查密鑰。 因此,例如,如果您的 REST 服務的 URL 模式類似於@Path("getCustomer/{customerId}")則鍵將是customerId ,值將是 URL 上的內容。

最后,如果您也想處理查詢參數,您可以使用getQueryParameters復制此循環,您可以在其中獲取MultivaluedMap

暫無
暫無

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

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