2016-05-06 4 views
0

は私が例file/image.jpgまたはfile/a/b/c/image.jpgのために、+任意のパスをfile/にマッチしますマッピングを持ちたいと私は唯一の1パス変数を持っている場合、私はそれを行うことができます私はfile/後に完全なパスを受けたい:Spring MVCには、マッピングファイル/ **からフルパスを取得する方法がありますか?

file/{file_name} 

しかし、私の場合のためにそれを行う方法を知らない。

(String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); 

しかし、私はよりエレガントな解決策を探しています:私は、私はこのようなパスを取得し、その後ちょうどfile/**をマッピングし、できることを知っています。そうする

答えて

0

一つの方法は、HTTPリクエストを作成する前spring-mvc迎撃

を使用されるだろう、あなたはスラッシュでそれを送ることができますし、要求が正しいハンドラによって処理されるURLEncoderその方法を使用してfile_nameパス変数を符号化します。次に、コントローラメソッドの前にメソッドが呼び出されるインターセプタを作成する必要があります。インターセプタでは、パス変数をURLDecoderでデコードし、属性として戻します。属性名はHandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE定数で指定され、すべてのパス変数のマップが含まれています。

インターフェイスのすべてのメソッドを実装しない場合は、インターセプタはHandlerInterceptorインターフェイスを実装するか、HandlerInterceptorAdapterを拡張する必要があります。デフォルトでは、この

public class UrlDecodeInterceptor extends HandlerInterceptorAdapter { 

private static final String ATTRIBUTE_VARIBLE_PATH = "file_name"; 

@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
     throws Exception { 

    Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); 

    if (pathVariables.containsKey(ATTRIBUTE_VARIBLE_PATH)) { 
     String decoded = URLDecoder.decode(pathVariables.get(ATTRIBUTE_VARIBLE_PATH), "UTF-8"); 

     pathVariables.put(ATTRIBUTE_VARIBLE_PATH, decoded); 
    } 

    return true; 
} 
} 

よう

何かが、spring-mvcが独自にURLをデコードします。 spring-servlet.xmlまたはサーブレット設定ファイルの内容を無効にする必要があります。

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="urlDecode" value="false" /> 
</bean> 

は、次に、あなたのコントローラハンドラがこの

@RequestMapping(value = "/file/{file_name}") 
public String someMethodName(@PathVariable("file_name") String fileName) { 

    System.out.println(fileName); // should contain decoded file_name 

    return null 
} 
+0

I ...丼のようになり、同じファイル末尾に

<mvc:interceptors> <bean id="urlDecodeInterceptor" class="path.to.your.package.UrlDecodeInterceptor" /> </mvc:interceptors> 

にインターセプターとしてUrlDecodeInterceptorを登録する必要がありますそれはよりエレガントな解決策だと思う:) – saroff

+0

それは複雑に見えるかもしれません。しかし、すべての '/ file/* 'リクエストを単一のハンドラで処理するよりも洗練されています。少なくともスケーラビリティの面では –

+0

@ saroff私はそれについて考えている。インターセプタ部分をスキップして、自動デコードを無効にし、 'file_name'をエンコードし、ハンドラ内のpath変数をデコードします。私はある時間前にインターセプターを使って解決した1つの問題から進んだ。しかし、あなたの場合よりもやや複雑でした。 –

関連する問題