[英]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.