Java URI模板需要与一组文件夹的变量值匹配

Java URI模板需要与一组文件夹的变量值匹配,java,spring,uritemplate,Java,Spring,Uritemplate,我正在使用org.springframework.web.util.UriTemplate,并尝试匹配此uri模板: http://{varName1}/path1/path2/{varName2}/{varName3}/{varName4} 具有以下uri: http://hostname/path1/path2/design/99999/product/schema/75016TC806AA/TC806AA.tar 目前,我获得了以下uri变量: {varName1=hostname,

我正在使用org.springframework.web.util.UriTemplate,并尝试匹配此uri模板:

http://{varName1}/path1/path2/{varName2}/{varName3}/{varName4}
具有以下uri:

http://hostname/path1/path2/design/99999/product/schema/75016TC806AA/TC806AA.tar
目前,我获得了以下uri变量:

{varName1=hostname, varName2=design/99999/product/schema, varName3=75016TC806AA,varName4=TC806AA.tar}
{varName1=hostname, varName2=design varName3=99999, varName4=product/schema/75016TC806AA/TC806AA.tar}
但我想得到以下uri变量:

{varName1=hostname, varName2=design/99999/product/schema, varName3=75016TC806AA,varName4=TC806AA.tar}
{varName1=hostname, varName2=design varName3=99999, varName4=product/schema/75016TC806AA/TC806AA.tar}
我尝试在模板中使用通配符作为*或+,但似乎不起作用:

http://{varName1}/path1/path2/{varName2}/{varName3}/{varName4*}

http://{varName1}/path1/path2/{varName2}/{varName3}/{+varName4}
编辑
字符串url=http://localhost/path1/path2/folder1/folder2/folder3/folder4/folder5
UriTemplate UriTemplate=新的UriTemplate(urlTemplateToMatch);
映射uriVariables=uriTemplate.match(url);
字符串urlTemplateToMatch1=http://{varName1}/path1/path2/{varName2}/{varName3}/{varName4}
uriVariables1={varName1=localhost,varName2=folder1/folder2/folder3,varName3=folder4,varName4=folder5}
字符串urlTemplateToMatch2=http://{varName1}/test1/test2/{varName2:.*?}/{varName3:.*?}/{varName4}
uriVariables2={varName1=localhost,varName2:.*=folder1/folder2/folder3,varName3:.*=folder4,varName4=folder5}
字符串urlTemplateToMatch3=http://{varName1}/test1/test2/{varName2:\\w*}/{varName3:.\\w*}/{varName4}
uriVariables3={varName1=localhost,varName2:\w*=folder1/folder2/folder3,varName3:\w*=folder4,varName4=folder5}
试试:

http://{varName1}/path1/path2/{varName2:.*?}/{varName3:.*?}/{varName4}

或者可能是

http://{varName1}/path1/path2/{varName2:\\w*}/{varName3:\\w*}/{varName4}

编辑

@RunWith(BlockJUnit4ClassRunner.class)
public class UriTemplateTest {

    private String URI = "http://hostname/path1/path2/design/99999/product/schema/75016TC806AA/TC806AA.tar";
    private String TEMPLATE_WORD = "http://{varName1}/path1/path2/{varName2:\\w*}/{varName3:\\w*}/{varName4}";
    private String TEMPLATE_RELUCTANT = "http://{varName1}/path1/path2/{varName2:.*?}/{varName3:.*?}/{varName4}";
    private Map<String, String> expected;

    @Before
    public void init() {
        expected = new HashMap<String, String>();
        expected.put("varName1", "hostname");
        expected.put("varName2", "design");
        expected.put("varName3", "99999");
        expected.put("varName4", "product/schema/75016TC806AA/TC806AA.tar");
    }

    @Test
    public void testTemplateWord() {
        testTemplate(TEMPLATE_WORD);
    }

    @Test 
    public void testTemplateReluctant() {
        testTemplate(TEMPLATE_RELUCTANT);
    }


    private void testTemplate(String template) {
        UriTemplate ut = new UriTemplate(template);
        Map<String, String> map = ut.match(URI);
        Assert.assertEquals(expected, map);
    }
}
@RunWith(BlockJUnit4ClassRunner.class)
公共类UriTemplateTest{
私有字符串URI=”http://hostname/path1/path2/design/99999/product/schema/75016TC806AA/TC806AA.tar";
私有字符串模板\u WORD=“http://{varName1}/path1/path2/{varName2:\\w*}/{varName3:\\w*}/{varName4}”;
私有字符串模板_=“http://{varName1}/path1/path2/{varName2:.*?}/{varName3:.*?}/{varName4}”;
私人地图;
@以前
公共void init(){
expected=新的HashMap();
应为.put(“varName1”、“hostname”);
预期。投入(“varName2”、“设计”);
预期。put(“varName3”、“99999”);
expected.put(“varName4”、“product/schema/75016TC806AA/TC806AA.tar”);
}
@试验
public void testTemplateWord(){
测试模板(模板\单词);
}
@试验
public void testTemplateReluctant(){
测试模板(模板);
}
私有void测试模板(字符串模板){
UriTemplate ut=新的UriTemplate(模板);
Map=ut.match(URI);
Assert.assertEquals(预期,映射);
}
}

查看URITemplate的代码,我看不到任何可能对您有帮助的内容。我唯一的想法是通过在varName4之前添加一个path3元素来澄清url,比如http://{varName1}/path1/path2/{varName2}/{varName3}/path3/{varName4}或者编写您自己的调整版本……因为我无法更改URITemplate,所以您的解决方案不是一个选项。您使用的是什么版本?。我为版本3.1.1添加了一个测试用例。我使用的是版本3.0.4。我想这就是为什么我的项目中没有这样做的原因。不,在这两次修订之间,UriTemplate类没有任何更改。我尝试了您的解决方案,但不幸的是没有成功。谢谢你的建议。两种模式都很好用。请发布您的测试代码和结果。