[rule]
id = "java-jaxrs-endpoint"
languages = ["java"]
category = "route"
confidence = "medium"
description = "JAX-RS / Jakarta REST resource method (@GET, @POST, @Path, ...)"
query = """
[
(marker_annotation
name: [
(identifier) @anno_name
(scoped_identifier
scope: (_) @anno_scope
name: (identifier) @anno_name)
])
(annotation
name: [
(identifier) @anno_name
(scoped_identifier
scope: (_) @anno_scope
name: (identifier) @anno_name)
])
] @match
"""
provenance_capture = "anno_scope"
[rule.predicates.anno_name]
match = "^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS|Path)$"
[[rule.tests]]
input = """
public class UserResource {
@GET
public List<User> list() { return null; }
}
"""
expect_match = true
[[rule.tests]]
input = """
@Path("/users")
public class UserResource {
public List<User> list() { return null; }
}
"""
expect_match = true
[[rule.tests]]
input = """
public class UserResource {
@POST
@Path("/users")
public Response create(User u) { return null; }
}
"""
expect_match = true
[[rule.tests]]
input = """
public class UserResource {
@jakarta.ws.rs.GET
public List<User> list() { return null; }
}
"""
expect_match = true
[[rule.tests]]
input = """
public class UserResource {
@javax.ws.rs.GET
public List<User> list() { return null; }
}
"""
expect_match = true
[[rule.tests]]
input = """
public class UserResource {
@jakarta.ws.rs.Path("/users")
public Response find() { return null; }
}
"""
expect_match = true
[[rule.tests]]
input = """
public class UserController {
@Override
public void delete() { }
}
"""
expect_match = false
[[rule.tests]]
input = """
public class UserController {
@Transactional
public void save() { }
}
"""
expect_match = false