2017-12-28 24 views
0

私はインターフェイスとそのインターフェイスの2つの実装を持っています。 今、インターフェース上に '@Component'アノテーションを追加しています。インプリメンテーションの1つに、呼び出されるだけの「@プライマリ」アノテーションがあります。 インターフェイスのメソッドをautowiredインターフェイスBeanから呼び出すときに、両方の実装を呼び出す必要があります。1回の呼び出しでインターフェイスのすべての実装を呼び出す

@Component 
public interface CustomerPersister { 
    AbuserDetails setAbuserDetails(AbuserDetails customer); 
} 


@Primary 
@Component 
public class CustomerRedisPersisterImpl implements CustomerPersister{ 
@Autowired 
private CustomerManager customerManager; 
@Override 
public AbuserDetails setAbuserDetails(AbuserDetails customer) { 
if(customerManager.setAbuserDetails 
(customer,ATSNamespaces.ABUSERDETAILS)){ 
     return customer; 
    }else{ 
     return new AbuserDetails(); 
    } 
} 



@Component 
public class MongoDbRepositoryImpl implements CustomerPersister{ 
    @Autowired 
    MongoTemplate mongoTemplate; 
    @Override 
    public AbuserDetails setAbuserDetails(AbuserDetails customer) { 
    Query query = new Query(Criteria.where("login").is(customer.getLogin())); 
    System.out.println("query is:"+query); 
    Update update = new Update(); 
    update.set("isReturnAbuser", customer.getIsReturnAbuser()); 
    update.set("reasonReturnAbuser", customer.getReasonReturnAbuser()); 
    update.set("isCODThrottled", customer.getIsCODThrottled()); 
    update.set("reasonRTOAbuser", customer.getReasonRTOAbuser()); 
    update.set("isFakeEmail", customer.getIsFakeEmail()); 
    update.set("reasonFakeEmail", customer.getReasonFakeEmail()); 
    update.set("amount",customer.getAmount()); 
    WriteResult result = mongoTemplate.upsert(query, update, AbuserDetails.class); 
    System.out.println("This is the class that got returned:"+result.getClass()); 
    System.out.println("New design result:"+result); 

    if(result!=null){ 
     if(result.getN() != 0) 
      return customer; 
     else 
      return null; 
    }else 
     return null; 
} 





someOtherClass 
    @Autowired 
    private CustomerPersister customerPersister; 


    @Override 
    @RequestMapping(value = "/abuser/details/set", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 
    public AbuserDetails setAbuserDetails(@RequestBody AbuserDetails customer){ 
     return customerPersister.setAbuserDetails(customer); 
    } 
+0

** 1)**。 *どちらの方法? 5. ** 2)**を宣言しました。他の4つの方法はどこで実装しますか? ** 3)**。両方の実装方法をいつ呼び出すのですか? – Lino

+0

@Lino私はちょうど編集しました。 1つの方法しかありません。私はその方法の2つの実装を持っています。私はそれらの両方が呼ばれるようにします。したがって、後で3番目の実装がある場合は、その実装を追加し、上記のコードを変更しなくてはなりません。 一部のその他のクラスでは、メソッドを呼び出しています。 – user1973987

答えて

0

あなたはListとしてのインターフェイスのすべての実装をautowireして、メソッドにすべての実装を呼び出すために春を告げることができます。もちろん

class SomeClass { 

    List<CustomerPersister> customerPersisters; 

    @Autowired 
    SomeClass(List<CustomerPersister> customerPersisters) { 
     this.customerPersisters = customerPersisters; 
    } 

    public void setAbuserDetails(@RequestBody AbuserDetails customer) { 
     for (CustomerPersister customerPersister: customerPersisters) { 
      customerPersister.setAbuserDetails(customer); 
     } 
    } 
} 

あなたが複数の存続の呼び出しから単一の値を返すことはできませんので、これは、あなたがcustomerPersister.setAbuserDetails()の結果を返すことができません。 SomeClassにいくつかのコードを書いて、どのオブジェクトを返すべきかを決めるか、すべての保持者からの結果のリストを返すことができます。または、要件を満たすためにインタフェースを再設計する必要があります。

関連する問題