WAR*_*N-R 10 java rest android spring-mvc thymeleaf
我目前有一个使用Spring控制器和Thymeleaf的项目来创建一个小浏览器应用程序.控制器类声明为
@Controller public class MyController {
Run Code Online (Sandbox Code Playgroud)
在控制器内部,我将GET定义为
@RequestMapping(value = "/foobars", method = RequestMethod.GET)
String index(Model model, --- more params ---) {
//call repository and get foobarsList
//model.addAttribute("foobars", foobarsList);
...
return "foobars/foobarThymeleafTemplate"
}
Run Code Online (Sandbox Code Playgroud)
的通话信息库,并得到foobarList是一个呼叫MongoRepository定义为:
public interface FoobarRepository extends MongoRepository< ... cut for brevity> {
@RestResource(rel = "by-id")
Marker findMarkerById(String id);
... additional @RestResources cut for brevity ...
}
Run Code Online (Sandbox Code Playgroud)
同样,浏览器应用程序看起来很棒.该GET调用存储库,填充模式与foobars的列表,并Thymeleaf做这件事与该名单.
问题:现在我需要从Android应用程序访问相同的数据,我更喜欢使用REST并在Android应用程序中使用JSON.我想保留Thymeleaf,但如有必要,将重构浏览器应用程序.
问题:有没有办法以某种方式使用相同的@Controller或者我必须使用带有/ restFoobars端点的@RestController维护第二个FoobarRestController?第二个REST控制器确实工作,但它似乎有点草率......糟糕的设计.
你的想法和建议?
再次感谢.-丰富
我在这里首选的方法是使用继承:
@RequestMapping('/foobars')
abstract class FoobarBaseController {
@RequestMapping
abstract listAll()
}
@Controller
class FoobarHtmlController extends FoobarBaseController {
@Override ModelAndView listAll() {
new ModelAndView('foobars/foobarThymeleafTemplate', [foobars: foobarsList])
}
}
@RestController
@RequestMapping('/foobars', produces = MediaType.APPLICATION_JSON_VALUE)
class FoobarJsonController extends FoobarBaseController {
@Override Collection<Foobar> listAll() {
foobarsList
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果需要完成大量工作来检查输入等,您可以在 中实现它,BaseController然后abstract listAllResponse(DomainObject foo)返回适当的ModelAndView(HTML) 或 DTO (JSON)。
这种方法的一个缺陷是您不能仅覆盖 的一部分@RequestMapping,因此在指定参数时必须重复映射的类部分produces,但您可以毫无问题地继承方法级映射。
| 归档时间: |
|
| 查看次数: |
9949 次 |
| 最近记录: |