1

我有一个设计问题:

我将使用一个例子来描述这个问题:

@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 和一个实现!

但这也会产生问题,因为我希望@Secured仅在通过 Web 服务而不是在调用 GlossaryServiceImpl 上的方法时才执行注释(在 GlossaryWebService 上)!

如果有人有任何想法建议,那将非常有帮助!提前致谢。

4

1 回答 1

0

由于 GlossaryWebServiceImpl 是访问 Web Service 服务时的入口点,因此我会将所有与 Web Service 相关的设置(角色、其他注释)放入其中,并将所有业务逻辑放入 GlossaryServiceImpl 中:

@WebService
public class GlossaryWebService{


   private GlossaryService glossaryService;

   @Secured("READ")
   public void foo() {
      glossaryService.foo();
   }

   @Secured("READ")
   public void goo() {
      glossaryService.goo();
   } 
}
于 2013-01-20T12:58:29.327 回答