Jersey JAX-RS - 匹配正则表达式

时间:2017-03-24 06:48:14

标签: java web-services rest jersey jax-rs

我有以下资源:

舍入资源

@Path("/rounds")
public class RoundResource {
  RoundService roundService = new RoundService();

    @Path("{roundUri}/matches")
    public MatchResource getMatchResource() {
        return new MatchResource();
    }
}

团队资源

@Path("/teams")
public class TeamResource {
    TeamService teamService = new TeamService();

    @Path("/{teamUri}/matches")
    public MatchResource getMatchResource() {
        return new MatchResource();
    }
}

匹配资源

@Path("/matches")
public class MatchResource {
    private MatchService matchService = new MatchService();

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Match> getTeamMatches(@PathParam("teamUri") String teamUri) {
        return matchService.getTeamMatches(teamUri);
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Match> getRoundMatches(@PathParam("roundUri") String roundUri) {
        return matchService.getRoundMatches(roundUri);
    }
}

哪里

/rounds/{roundUri}/matches 

获得一轮

的匹配
/teams/{teamUri}/matches 

获得团队的匹配

我得到了匹配的正则表达式错误,因为匹配资源中的路径是 /匹配,并且两个路径都以此结束。怎么解决?

2 个答案:

答案 0 :(得分:0)

问题出在您的匹配资源中。这两种方法映射到相同的url i,e

/ matches所以如果你没有给方法提供任何@Path注释,那么只有一个方法可以避免碰撞或者给它们中的任何一个或两者都提供@Path注释。它会起作用

我不明白为什么你在你的问题中提到了正则表达式。当你问的问题与正则表达无关时。

无论如何为路径参数提供模式,您可以添加像这样的代码

@Path("method1/{parameter1: [a-zA-Z][a-zA-Z_0-9]*}") // this regular  expression is for alphanumeric

你应该在方法上使用@Path注释,在参数上使用@PathParam注释才能正常工作

你应该在匹配资源

中编码
@Path("{teamUri}")

@Path("/roundUri/{roundUri}") 

关于你的工作方法

这适用于/matches/xxxdf/matches/roundUri/xalfo

等网址

像这样改变你的代码它会起作用

@Path("/matches")
public class MatchResource {
private MatchService matchService = new MatchService();

@GET
@Path("{teamUri}")
 //or  @Path("{teamUri:[a-zA-Z][a-zA-Z_0-9]*}") if you want to use regular expressions
@Produces(MediaType.APPLICATION_JSON)
public List<Match> getTeamMatches(@PathParam("teamUri") String teamUri) {
    return matchService.getTeamMatches(teamUri);
}

@GET
@Path("roundUri/{roudUri}")
  //or  @Path("{roundUri:[a-zA-Z][a-zA-Z_0-9]*}") if you want to use regular expressions
@Produces(MediaType.APPLICATION_JSON)
public List<Match> getRoundMatches(@PathParam("roundUri") String roundUri) {
    return matchService.getRoundMatches(roundUri);
}
}

这里的重点是您的资源网址不应该发生冲突

答案 1 :(得分:0)

我在匹配资源方法中添加了@Path(“ OPTION ”)注释,以指定我是想要轮次还是按团队进行匹配:

舍入资源

@Path("/rounds")
public class RoundResource {
  RoundService roundService = new RoundService();

    @Path("{roundUri}/matches")
    public MatchResource getMatchResource() {
        return new MatchResource();
    }
}

团队资源

@Path("/teams")
public class TeamResource {
    TeamService teamService = new TeamService();

    @Path("/{teamUri}/matches")
    public MatchResource getMatchResource() {
        return new MatchResource();
    }
}

匹配资源

@Path("/matches")
public class MatchResource {
    private MatchService matchService = new MatchService();

    @GET
    @Path("/byteam")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Match> getTeamMatches(@PathParam("teamUri") String teamUri) {
        return matchService.getTeamMatches(teamUri);
    }

    @GET
    @Path("/byround")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Match> getRoundMatches(@PathParam("roundUri") String roundUri) {
        return matchService.getRoundMatches(roundUri);
    }
}

现在我有:

/rounds/{roundUri}/matches/byround 

获得一轮

的匹配
/teams/{teamUri}/matches/byteam 

获得团队的匹配