我想知道是否仅使用EJB来使用拦截器是一个好主意?
我已使用@TransactionAttribute(NEVER)
关闭了事务管理,因此它不具备任何不需要的事务管理功能。
我知道这可以在Spring完成。但我仍然想知道我的想法是否合适。
如果这是一个坏主意,任何人都可以告诉我如何使用作为JEE规范一部分的API来做到这一点。如果使用任何JEE API无法做到这一点,那么我不介意使用Spring。
顺便说一下,我需要拦截器,因为我的应用程序中有很多日志记录代码。每次请求到来时,我都必须在表格中保留记录,还有其他内容。
P.S。
我是EJB的新手。我知道使用EJB,我们可以获得事务管理和拦截器等功能。
我有一个应用程序,其中服务作为REST和SOAP Web服务公开。我们还计划使用远程EJB将服务公开为远程服务。
我们在每个服务中都写了一些日志代码。在返回方法之前,日志代码基本上会在表中记录详细信息。我们还有一些服务可以调用一些3pp的Web服务。我们将这些详细信息记录在另一个表中。日志代码用每种服务方法编写。
所以我想出了一个介绍拦截器并将日志代码移动到适当的拦截器的想法。最初我已经介绍了几种方法的拦截器。代码工作正常,现在我想重写我的所有服务来使用这些拦截器。
现在我想如果仅使用EJB来拦截方法是个好主意。我不想使用除拦截器之外的任何其他EJB功能。所以我用@TransactionAttribute(NEVER)
关闭了事务管理。我的课程看起来像下面的
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class StudentServiceBean {
@ReportingInterceptor
public Student getStudent(String id) {
}
}
@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class StudentBackendBean {
@BackendInterceptor
public Student getStudent(String id) {
}
}
以下是我的问题
我无法使用过滤器,因为我们计划将服务公开为远程ejbs。由于过滤器无法拦截远程ejb调用,我不想使用过滤器。
答案 0 :(得分:1)
基本上,使用@Stateless
注释您的类已经使它成为EJB。所以,在这种情况下,我没有看到使用Interceptor完成你提到的工作有任何问题。说实话,拦截器完全是为了做这种工作。
关于您的问题:
除了转换交易管理之外还有什么我应该考虑的事情吗?
没有。如果您继续使用@TransactionAttribute(TransactionAttributeType.NEVER)
bean作为服务。请记住,您没有禁用交易,mcloudstack:~/workspace/sample_app (master) $ rails test
Running via Spring preloader in process 8379
Started with run options --seed 47305
ERROR["test_full_title_helper", ApplicationHelperTest, 0.011410524020902812]
test_full_title_helper#ApplicationHelperTest (0.01s)
NameError: NameError: undefined local variable or method `full_title' for #<ApplicationHelperTest:0x0000000386d230>
test/helpers/application_helper_test.rb:5:in `block in <class:ApplicationHelperTest>'
ERROR["test_layout_links", SiteLayoutTest, 0.5379643210908398]
test_layout_links#SiteLayoutTest (0.54s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `full_title' for #<#<Class:0x000000060dfb50>:0x000000060e3e80>
app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb___1744770820645383621_50825200'
test/integration/site_layout_test.rb:6:in `block in <class:SiteLayoutTest>'
ERROR["test_should_get_new", UsersControllerTest, 0.5737704820930958]
test_should_get_new#UsersControllerTest (0.57s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `full_title' for #<#<Class:0x00000005169478>:0x0000000515de98>
app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb___1744770820645383621_42595720'
test/controllers/users_controller_test.rb:6:in `block in <class:UsersControllerTest>'
ERROR["test_should_get_about", StaticPagesControllerTest, 0.6096331640146673]
test_should_get_about#StaticPagesControllerTest (0.61s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `full_title' for #<#<Class:0x000000060dfb50>:0x00000004a8ff08>
app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb___1744770820645383621_38997440'
test/controllers/static_pages_controller_test.rb:18:in `block in <class:StaticPagesControllerTest>'
ERROR["test_should_get_help", StaticPagesControllerTest, 0.6480439120205119]
test_should_get_help#StaticPagesControllerTest (0.65s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `full_title' for #<#<Class:0x000000060dfb50>:0x000000030fc730>
app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb___1744770820645383621_25230720'
test/controllers/static_pages_controller_test.rb:12:in `block in <class:StaticPagesControllerTest>'
ERROR["test_should_get_contact", StaticPagesControllerTest, 0.692532810033299]
test_should_get_contact#StaticPagesControllerTest (0.69s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `full_title' for #<#<Class:0x000000060dfb50>:0x000000021e4bf8>
app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb___1744770820645383621_24873900'
test/controllers/static_pages_controller_test.rb:24:in `block in <class:StaticPagesControllerTest>'
ERROR["test_should_get_home", StaticPagesControllerTest, 0.749511854024604]
test_should_get_home#StaticPagesControllerTest (0.75s)
ActionView::Template::Error: ActionView::Template::Error: undefined method `full_title' for #<#<Class:0x000000060dfb50>:0x000000049c7e40>
app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb___1744770820645383621_30378000'
test/controllers/static_pages_controller_test.rb:6:in `block in <class:StaticPagesControllerTest>'
7/7: [=============] 100% Time: 00:00:00, Time: 00:00:00
Finished in 0.75916s
7 tests, 0 assertions, 0 failures, 7 errors, 0 skips
您只是告诉bean不支持TX。但在你的情况下,没关系。
仅使用EJB来利用拦截器是一个好主意吗?
好吧,小心点。如果您不使用Java EE平台的优势,我认为一小部分配置就足够了。看看这个:http://www.vogella.com/tutorials/REST/article.html。
由于我们的应用程序包含100个服务,应用程序将如何扩展? (我知道缩放是基于可用的资源)。
我认为在企业应用程序中使用大约100个服务时没有任何问题。但是我会考虑将它分成一些单独部署的未成年人应用程序。