繁体   English   中英

在Spring框架中基于实体对象调用不同的Service api

[英]Call different Service api's based on the entity object in spring framework

我正在使用Spring框架设计的Web服务应用程序上工作,在这里我有从基类“ activity”继承的不同实体类(ActivityA,ActivityB,ActivityC ...)

现在,我在服务层中为基类和所有子类编写了不同的服务api。 (例如,ActivityService,ActivityAService,ActivityBService,ActivityCService ..)

所有对每个活动操作类似的方法都放在基类(ActivityService)的服务api中,并置于各自的服务中。

我通常知道我正在处理哪个对象,因此我分别调用了服务api。 但是在特定情况下,我有活动对象(不知道它是哪个子类),并且必须编写一个对于所有实体对象都不同的方法。

问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,不是服务,我无法进行任何硬编码来获取服务对象)

但是在特定情况下,我有活动对象(不知道它是哪个子类),并且必须编写一个对于所有实体对象都不同的方法。

只需将基类抽象化并定义每个子类必须实现的抽象方法:

public abstract class ActivityService{
    public abstract Foo processEntity(Entity entity);
}

问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,而不是服务,并且我无法对其进行任何硬编码)

您应该尝试避免这种情况。 通常,您应该只将实体发送给知道如何处理实体的服务,而不要发送给一堆负责的服务。 但是我要做的是使用调度程序服务,该服务保留服务负责的类的映射。 它使用如下逻辑:

private Map<Class<? extends Entity>,
    Class<? extends ActivityService>> serviceMap =
        new ConcurrentHashMap<Class<? extends Entity>,
                              Class<? extends ActivityService>>();
private ApplicationContext context;
private ActivityService getServiceForEntity(Entity e){
    Class<? extends Entity> entityClass = e.getClass();
    Class<? extends ActivityService> serviceClass =
        serviceMap.get(entityClass);
    if(serviceClass==null){
        for(Map.Entry<Class<? extends Entity>,
                      Class<? extends ActivityService>> entry :
            serviceMap.entrySet()){
            if(entry.getKey().isAssignableFrom(entityClass)){
                serviceClass = entry.getValue();
                break;
            }
        }
        if(serviceClass==null){
            // throw a suitable exception
        }
        serviceMap.put(entityClass, serviceClass);
    }
    return context.getBean(serviceClass);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM