2012-01-04 55 views
6

我有一個像功能:在Jersey中,我可以將QueryParams和FormParams組合成一個方法的值嗎?

@POST 
@Path("/create") 
@Produces({MediaType.APPLICATION_JSON}) 
public Playlist createPlaylist(@FormParam("name") String name) 
{ 
    Playlist p = playlistDao.create(); 
    p.setName(name); 
    playlistDao.insert(p); 
    return p; 
} 

我想要的「名」參數來從形式或從查詢參數。如果用戶發佈到/ playlist/create /?name = bob,那麼我希望它能夠工作。 (這主要是爲了幫助測試API,但也用於在不同的非瀏覽器平臺上使用它。)

我願意將任何使魔術綁定工作的子類...(@BothParam(「name 「)字符串名稱),但需要一些幫助來實現這一點,因爲我是Jersey/Java Servlets的新手。


更新:第二天...

我已經通過實施合併的形式參數到查詢參數的ContainerRequestFilter解決了這個。這不是最好的解決方案,但它似乎工作。我沒有任何運氣將任何東西合併到表單參數中。

這裏的,以防有人代碼來尋找它:

@Override 
public ContainerRequest filter(ContainerRequest request) 
{ 
    MultivaluedMap<String, String> qParams = request.getQueryParameters(); 
    Form fParams = request.getFormParameters(); 
    for(String key : fParams.keySet()) 
    { 
     String value = fParams.get(key).get(0); 
     qParams.add(key, value); 
    } 
} 

我仍然欣賞知道是否有更好的方法來做到這一點,所以我會離開這個問題打開了。

回答

3

您可以這樣做的一種方法是使用InjectableProvider

首先,你定義一個BothParam註釋:

@Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface BothParam { String value(); } 

然後,爲它定義一個InjectableProvider

@Provider 
public class BothParamProvider implements Injectable<String>, InjectableProvider<BothParam, Type> {  
    @Context private HttpContext httpContext; 
    private String parameterName; 

    public BothParamProvider(@Context HttpContext httpContext) { 
     this.httpContext = httpContext; 
    } 

    public String getValue() {   
     if (httpContext.getRequest().getQueryParameters().containsKey(parameterName)) { 
      return httpContext.getRequest().getQueryParameters().getFirst(parameterName); 
     } else if(httpContext.getRequest().getFormParameters().containsKey(parameterName)) { 
      return httpContext.getRequest().getFormParameters().getFirst(parameterName); 
     } 
     return null; 
    } 

    public ComponentScope getScope() { 
     return ComponentScope.PerRequest; 
    } 

    public Injectable getInjectable(ComponentContext cc, BothParam a, Type c) {   
     parameterName = a.value(); 
     return this; 
    }  
} 

注意,這不是真正的QueryParamFormParam耦合。用這些註釋中的任何一個注入的目標都是以更復雜的方式注入的。但是,如果您的需求足夠有限,上述方法可能適用於您。

+0

我找不到Injectable和InjectableProvider類。他們是否在最近的澤西島體育場下臺?有沒有更換? – 2015-11-26 02:51:34

+0

如果按照最近的澤西島庫你指的是2.x版本,那麼,是的,我相信有一個替代品 - http://stackoverflow.com/questions/18463311/jersey-2-how-to-replace-injectableprovider -and-abstracthttpcontextinjectable – maxenglander 2015-11-27 18:08:41

相關問題