2017-02-01 21 views
1

私は答えを探していて、非常に似たような問題を解決したにもかかわらず、多くの回答が私の問題を解決しませんでした。Spring MVC @PathVariableは404エラーを返します

私の問題はこれです:文字 "/"を含む可能性のあるパス変数があります。同じ値には、 "。"などの他の特殊文字も含まれています。 "+" "="などすべての有効なBase64文字を含みます。

しかし、Spring MVCは、ハンドラが見つからないというログを持つ404をスローします。私はパス変数にも正規表現を使ってみましたが、役に立たなかった。そのため、私のコードスニペットは:

http://localhost:8080/sale/public/viewSaleDetails/b91a03730a746a2b27e1c7bbbd94ddf6a9df593301cd96c606348df5eed235da.FkJJbOqEM8Xvhffe6FwUdQ8/mMCD4+fxpY7w5L9kbJ8= 

は私のURLです。/inパス変数の値があることがわかります。に加えて "。" 「+」および「=」を含む。文字 "m"と "8"を削除すると、Springはこれを正しくマップします。しかし、価値のあるものでは、それはちょうどうまくいきません。私は文字のフィルタリング、パス変数などの正規表現を含む多くのことを試してみてください。

また、リクエストパラメータを可能な限り使用したくありません。

@RequestMapping(value = "/public/viewSaleDetails/{id}", method = RequestMethod.GET) 

は私のマッピングです。またURLはURLエンコーディングなしでブラウザからヒットします。私はブラウザのネットワークバーでそれを追跡し、それは期待どおりにそれをエンコードしません。私はSpring 4.2.8 RELEASEバージョンをjava 8とtomcat 8で使用しています。

+0

私はしかし、あなたがいくつかのURL書き換えを使用することができ、春はPathVariablesに「/」扱うことができるならば、私はそれが動作しませんと思うわからないんだけどパブリック/ viewSaleDetails/{id}からあなたのPathVariableをあなたのコントローラに到達する前にRequestParam public/viewSaleDetails?id = xxに変換してください。 –

答えて

0

パスに一致するスラッシュに従ってopen issue in spring Jiraがあります。議論のために、フレームワークレベルでの数学戦略を変更することは合理的ではありません。問題はthis stackoverflow postのために作成されました。私はthe answerに従ってバリューリゾルバを作成することをお勧めします。ここで

は、このようなリゾルバのコード例は次のとおりです。

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.MethodParameter; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.bind.support.WebDataBinderFactory; 
import org.springframework.web.context.request.NativeWebRequest; 
import org.springframework.web.context.request.RequestAttributes; 
import org.springframework.web.method.support.HandlerMethodArgumentResolver; 
import org.springframework.web.method.support.ModelAndViewContainer; 
import org.springframework.web.servlet.HandlerMapping; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 

import java.util.List; 

@SpringBootApplication 
public class SampleSpringApp { 
    public static void main(String[] args) { 
     SpringApplication.run(SampleSpringApp.class, args); 
    } 
} 

@RestController 
class SampleController { 
    @RequestMapping("/records/**") 
    public String getId(Id id) { 
     return id.id; 
    } 
} 

@Configuration 
@EnableWebMvc 
class WebConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 
     argumentResolvers.add(new IdResolver()); 
    } 
} 

class IdResolver implements HandlerMethodArgumentResolver { 
    @Override 
    public boolean supportsParameter(MethodParameter parameter) { 
     return Id.class.isAssignableFrom(parameter.getParameterType()); 
    } 

    @Override 
    public Object resolveArgument(MethodParameter parameter, 
            ModelAndViewContainer mavContainer, 
            NativeWebRequest webRequest, 
            WebDataBinderFactory binderFactory) throws Exception {  
     String basePath = ((String) webRequest.getAttribute(
       HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE, 
       RequestAttributes.SCOPE_REQUEST 
     )).replace("**", ""); 
     String id = ((String) webRequest.getAttribute(
       HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, 
       RequestAttributes.SCOPE_REQUEST 
     )).replace(basePath, ""); 
     return new Id(id); 
    } 
} 

class Id { 
    public final String id; 

    Id(String id) { 
     this.id = id; 
    } 
} 
関連する問題