动态扩展Spring MVC驱动的REST api,只能访问应用程序jar

时间:2014-05-30 00:08:26

标签: java spring rest

我处于这样一种情况:我有一个新生的休息api架构,其中每个方法都有大量的仪式(验证,数据库连接获取/释放,身份验证),原始请求/响应对象作为参数,以及硬编码的json字符串作为输出。我想使用spring mvc来帮助解决这些问题中的至少一些问题(auth& db stuff我需要推迟)。这将使许多当前架构变得不必要。除了当前架构的一个特性之外,这非常简单:动态添加api调用。

体系结构的入口点(servlet)从xml文件读取,该文件包含请求的路径和要加载的相应类。该类必须实现一个包含' execute'具有请求逻辑的方法。加载类后,servlet调用此execute方法。这允许如下动态扩展api。该应用程序与相关的配置(xml)文件一起打包为jar,并提供给客户端。客户端在他的项目中包含这个jar,创建一个实现上述接口的类,并在包含的xml文件中添加从请求url到该类的映射。然后他运行应用程序并访问原始api和他的自定义api。

示例:

客户端获得app.war,interface.jar和custom-mappings.xml。 app.war包含核心api(rest webservice)的实现,而interface.jar公开了具有方法' execute'的接口BaseController。 (app.jar也在其控制器中使用此接口)。客户然后按如下方式定义自己的类。

package custapi.controllers;

public class ExtendedController implements BaseController {
public void execute(HttpServletRequest request, HttpServletResponse response) {
// LOGIC
}
}

他编译这个类并将其添加到app.war。接下来,他使用以下条目更新custom-mappings.xml。

/ custcall /的MyCall custapi.controllers.ExtendedController

然后他部署了应用程序。提供核心api的控制器接收请求/ custcall / mycall,在custom-mappings.xml中查找它,发现类是custapi.controllers.ExtendedController,加载该类,最后运行它的“执行”#39 ;方法。这允许运行客户端定义的逻辑。

理想:

当前的架构被spring-mvc取代。也就是说,没有更多的超级'控制器,它将请求和委托解析为适当的类,最后是方法。 Spring处理这个。对于使用此新架构的应用程序,客户端将收到app.war和暴露控制器注释的spring mvc deps。然后,客户端将创建一个新的spring mvc控制器(利用验证,参数 - > pojo映射,对象 - > json转换),编译它,并将生成的类文件添加到app.war。然后他的控制器将成为应用程序暴露的核心API的扩展。部署应用程序时,他可以像以前一样发出请求/ custcall / mycall并让它执行他定义的逻辑。这个理想的场景允许核心api(我和其他人编程)的清晰代码和扩展的api。 (这种方法的缺点是客户端与spring绑定。在更理想的情况下,客户端将使用框架无关的注释,这些注释被应用程序映射到spring注释。我不确定这有多容易会是。)

我不确定如何在不牺牲弹簧优势的情况下使用弹簧感应控制器实现上述目标。我不相信客户可以简单地定义另一个弹簧感知控制器(如果我错了,请纠正我)。我能想到的唯一解决方案是让一个具有通配符路径的弹簧感知控制器(例如/ cust_rest / *)与当前控制器完全相同。客户端不会获得Spring提供的任何优势,但核心api会更清洁。但我希望有更好的解决方案。理想情况下,客户端无需访问核心API源代码即可获得spring的好处。关于这个的任何想法,或者我的解决方案是最好的希望?

感谢。

(注意:对于这两种情况,我只是猜测客户端实际上如何获得对依赖关系/接口和部署的访问权限。我只能访问核心api项目一天,所以我对它的理解不是完成)。

相关:Runtime loading of Controllers for Spring MVC and dynamically mapping requests/URLs

上述问题看起来与我的非常相似。回复是稀疏的(第二个是关于主题,我相信)。

1 个答案:

答案 0 :(得分:0)

如果您正确设置了类路径扫描,则无需接口。您的客户只需使用@Controller @RequestMapping("/foo/bar")注释类。即使这个类位于自己的jar中,它仍然会被扫描。如果这是REST服务,请考虑使用@RestController来避免必须在每个处理程序方法上放置@ResponseBody

使用spring security进行声明式身份验证&授权(你现在正在做的是程序化安全性)

相关问题