Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用不同的服务api';基于spring框架中实体对象的_Java_Spring_Inheritance_Service_Class Hierarchy - Fatal编程技术网

Java 调用不同的服务api';基于spring框架中实体对象的

Java 调用不同的服务api';基于spring框架中实体对象的,java,spring,inheritance,service,class-hierarchy,Java,Spring,Inheritance,Service,Class Hierarchy,我正在开发一个使用spring框架设计的web服务应用程序,其中我有不同的实体类(ActivityA、ActivityB、ActivityC…),它们继承自基类“activity” 现在,我在服务层为基类和所有子类编写了不同的服务api。(要命名,ActivityService,ActivityAsService,ActivityBService,ActivityService.) 对每个活动进行类似操作的所有方法都放在基类(ActivityService)的服务api中,其余的放在各自的服务中

我正在开发一个使用spring框架设计的web服务应用程序,其中我有不同的实体类(ActivityA、ActivityB、ActivityC…),它们继承自基类“activity”

现在,我在服务层为基类和所有子类编写了不同的服务api。(要命名,ActivityService,ActivityAsService,ActivityBService,ActivityService.)

对每个活动进行类似操作的所有方法都放在基类(ActivityService)的服务api中,其余的放在各自的服务中

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

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

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

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

public abstract class ActivityService{
    public abstract Foo processEntity(Entity entity);
}
问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,而不是服务,我不能进行任何硬编码)

这是一种你应该尽量避免的情况。通常,您应该只将一个实体发送给知道如何处理它的服务,而不是发送给一组由其中一个负责的服务。但我要做的是使用一个dispatcher服务,它保存服务负责的类的映射。它使用如下逻辑:

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);
}

private MapThank S.P.我不能重写该方法,因为我说过我只有实体对象,没有服务对象。上面给出的获得给定对象的相应服务类的解决方案可能就是应该做的。。但是我希望(我是spring的新手)spring能够以某种方式将实体与其相应的服务联系起来@shail,正如我说的,我只有实体对象,而不是服务对象。哦,我想这是另一种方式。不,Spring不知道应用程序的体系结构,所以它不能为您这样做。构建应用程序以确保每个实体都被传递到正确的服务时,这是您的工作。通常每个实体类型都有一个控制器,它会注入正确的服务。我得到了一个实体内容,可以有不同的活动。正如我上面提到的,我设计了不同的活动作为基类活动的子类。现在,我通常使用相应的控制器对任何活动进行操作。但我有一个复制内容的功能(这意味着我还需要创建与该内容关联的所有活动的新副本,并将它们与新创建(复制)的内容关联)。所有活动都有内容的外键,根据外键我可以得到要复制的活动,但对象的类型(哪个子类)运行时之前不知道返回的。。所有活动的服务api都有复制方法(内部复制方法对于每个活动分配不同)。我认为我可以使用方法重写并为返回的每个对象调用一个copy方法(当我根据内容获取活动时),现在唯一可能的方法是从实体对象获取相应的服务api,正如上面所解释的。现在知道了整个情况,你认为有没有更好的不同方法。。?请让我知道。非常感谢你。