0
@Component
@Qualifier("SUCCESS")
public class RandomServiceSuccess implements RandomService{
    public String doStuff(){
       return "success";
   }
}

@Component
@Qualifier("ERROR")
public class RandomServiceError implements RandomService{
    public String doStuff(){
       throw new Exception();
   }
}

呼び出しコード

 @Controller
    public class RandomConroller {
        @Autowired 
        private RandomService service;
        public String do(){
           service.doStuff();
       }
    }

ここで行う必要があるのは、http 要求のカスタム http ヘッダーから取得できる値に基づいてそれらを交換することです。ありがとうございました!

4

3 に答える 3

3

私は、すべての実装を注入し、実行時にそのうちの 1 つを選択する必要があるという Sotirios Delimanolis に完全に同意します。

多くの実装があり、選択ロジックRandomServiceを混乱させたくない場合は、次のように、選択を担当する実装を作成できます。RandomControllerRandomService

public interface RandomService{
    public boolean supports(String headerValue);
    public String doStuff();
}

@Controller
public class RandomConroller {
    @Autowired List<RandomService> services;

    public String do(@RequestHeader("someHeader") String headerValue){
        for (RandomService service: services) {
            if (service.supports(headerValue)) {
                 return service.doStuff();
            }
        }
        throw new IllegalArgumentException("No suitable implementation");
    }
}

異なる実装の優先度を定義したい場合はOrdered、注入された実装を使用してTreeSetwithに入れることができますOrderComparator

于 2013-10-29T17:55:07.130 に答える
0

両方を注入して、必要な方を使用するだけです。

@Inject
private RandomServiceSuccess success;

@Inject
private RandomServiceError error;

...
String value = request.getHeader("some header");
if (value == null || !value.equals("expected")) {
    error.doStuff();
} else {
    success.doStuff();
}
于 2013-10-29T17:36:44.477 に答える
0

修飾子を使用して、それぞれに異なる ID を指定した後、フィールドに挿入するインターフェイスのインスタンスを指定する必要があります。@Soritios のアドバイスに従って、次のようなことができます。

@Component("SUCCESS")
public class RandomServiceSuccess implements RandomService{
    public String doStuff(){
       return "success";
   }
}

@Component("ERROR")
public class RandomServiceError implements RandomService{
    public String doStuff(){
       throw new Exception();
   }
}


@Component
public class MyBean{
    @Autowired
    @Qualifier("SUCCESS")
    private RandomService successService;

    @Autowired
    @Qualifier("ERROR")
    private RandomService successService;

    ....
    if(...)
}

...または、パラメーターに基づいてアプリケーション コンテキストから必要なインスタンスだけを取得することもできます。

@Controller
public class RandomConroller {
    @Autowired
    private ApplicationContext applicationContext;

    public String do(){
        String myService = decideWhatSericeToInvokeBasedOnHttpParameter();

        // at this point myService should be either "ERROR" or "SUCCESS"
        RandomService myService = applicationContext.getBean(myService);

        service.doStuff();
   }
}
于 2013-10-29T17:46:34.927 に答える