首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何基于FF4j路径参数设置RegionFlippingStrategy?

如何基于FF4j路径参数设置RegionFlippingStrategy?
EN

Stack Overflow用户
提问于 2020-06-22 13:21:09
回答 1查看 519关注 0票数 2

我刚刚开始使用FF4j在两个不同的API实现之间切换,具体取决于用户所在的市场(market = brand/country对)。下面是代码片段:

代码语言:javascript
复制
@RestController
@RequestMapping("/{brand}/{country}")
public class HomeController {

    private final ApiService apiService;

    public HomeController(@Qualifier("new-api") ApiService apiService) {
        this.apiService = apiService;
    }

    @GetMapping("/hey")
    public String hey(@PathVariable("brand") String brand,
                      @PathVariable("country") String country) {
        return apiService.whichApi();
    }

}

interface ApiService {
    @Flip(name = "legacy-api", alterBean = "legacy-api")
    String whichApi();
}

@Component("new-api")
class NewApiApiService implements ApiService {
    @Override
    public String whichApi() {
        return "NEW_API";
    }
}

@Component("legacy-api")
class LegacyApiApiService implements ApiService {
    @Override
    public String whichApi() {
        return "LEGACY_API";
    }
}

我创建了一个RegionFlippingStrategy (正如医生说的)来定义我想要对哪个market使用legacy-api,但我无法使它工作。

我如何在FF4j中注册我的新策略?

如何在基于家庭控制器brand/country输入的API之间进行动态切换?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-23 08:47:32

如何将我的新策略注册到FF4j ?

让我们提醒一下策略代码

代码语言:javascript
复制
public class MarketFlippingStrategy extends AbstractFlipStrategy {

 private final Set<String> setOfGrantedMarket = new HashSet<String>();

 @Override
 public void init(String featureName, Map<String, String> initValue) { 
   super.init(featureName, initValue);  
   assertRequiredParameter("grantedMarket");
   String[] arrayOfRegions = initValue.get("grantedMarket").split(",");
   setOfGrantedRegions.addAll(Arrays.asList(arrayOfRegions));
 }

 @Override
 public boolean evaluate(String fName, FeatureStore fStore, FlippingExecutionContext ctx) {
  return setOfGrantedRegions.contains(ctx.getString("market", true));
 }
}

FlipStrategy应该在特性legacy-api的定义中注册。

  • 您可以使用web控制台手动完成此操作(特性>编辑特性>选择字段策略并编辑类和参数(param1=value1)。
  • 您可以在一个文件中这样做,并使用控制台ff4j导入,现在支持xmlyamlproperties

根据以下定义,该功能将仅在授予的市场上启用:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<features>
 <feature uid="legacy-api" enable="true" >
  <flipstrategy class="org.ff4j.sample.strategy.MarketFlippingStrategy" >
    <param name="grantedMarket">country1-brand1,country1-brand2</param>
  </flipstrategy>
 </feature>
</features>

如何基于家庭控制器品牌/国家输入动态切换API ?

“诀窍”是将这对品牌/国家作为单变量market传递到FlippingExecutionContext中,这将帮助您理解它是如何工作的。

代码语言:javascript
复制
@RestController
@RequestMapping("/{brand}/{country}")
public class HomeController {

    private final ApiService apiService;

    public HomeController(@Qualifier("new-api") ApiService apiService) {
        this.apiService = apiService;
    }

    @GetMapping("/hey")
    public String hey(@PathVariable("brand") String brand,
                      @PathVariable("country") String country) {
        FlippingExecutionContext executionContext = new FlippingExecutionContext();
        executionContext.putString("market", brand + "-" + country);
        return apiService.whichApi(executionContext);
    }

}

interface ApiService {
    @Flip(name = "legacy-api", 
          alterBean = "legacy-api", 
          flippingStrategy = MarketFlippingStrategy.class,
          contextLocation = ContextLocation.PARAMETER)
    String whichApi(FlippingExecutionContext context);
}

@Component("new-api")
class NewApiApiService implements ApiService {
    @Override
    public String whichApi(FlippingExecutionContext context) {
        return "NEW_API";
    }
}

@Component("legacy-api")
class LegacyApiApiService implements ApiService {
    @Override
    public String whichApi(FlippingExecutionContext context) {
        return "LEGACY_API";
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62515458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档