我有一个设计问题:
我将用一个例子来描述这个问题:
@WebService
public interface GlossaryWebService {
@Secured("READ")
public void foo();
@Secured("READ")
public void goo();
}
实现方式:
@WebService
public class GlossaryWebServiceImpl implements GlossaryWebService{
private GlossaryService glossaryService;
@Override
public void foo() {
glossaryService.foo();
}
@Override
public void goo() {
glossaryService.goo();
}
}
接口:
public interface GlossaryService {
public void foo();
public void goo();
}
实现方式:
public Class GlossaryServiceImpl extends GlossaryService{
@Override
public void foo() {
// impl
}
@Override
public void goo() {
// impl
}
}
如您所见,我们已经在GlossaryWebServiceImpl中实现了GlossaryWebService
和GlossaryServiceImpl实现GlossaryService!
问题是,GlossaryWebServiceImpl充当外观(对于GlossaryService),并且
导致代码重复。 GlossaryService中的方法也需要在GlossaryWebService中
并且GlossaryServiceImpl中的方法也需要在GlossaryWebServiceImpl中!
我可以通过使GlossaryServiceImpl实现GlossaryWebService来保存GlossaryWebServiceImpl的创建
这样,我们将只有2个Iterfaces和1个实现!
但这也造成了问题,因为我希望
@Secured
注释(在GlossaryWebService上)仅在通过Web服务时执行,而不是在调用GlossaryServiceImpl上的方法时执行!
如果有人有任何想法建议,那将非常有帮助!
提前致谢。
最佳答案
由于GlossaryWebServiceImpl是访问Web服务表单时的入口点,因此我将所有与Web Service相关的设置(角色,其他注释)放入其中,并将所有业务逻辑放入GlossaryServiceImpl中:
@WebService
public class GlossaryWebService{
private GlossaryService glossaryService;
@Secured("READ")
public void foo() {
glossaryService.foo();
}
@Secured("READ")
public void goo() {
glossaryService.goo();
}
}