Controller层实现,直接上代码。
@RestController
public class WebFluxController {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
private ScenarioQueryService service;
@Autowired
ApplicationContext applicationContext;
@GetMapping(value = "/xxx/{domain}/{action}")
public Mono<Object> invokeService(@PathVariable(name = "domain") String domain,@PathVariable(name = "action") String action,WebRequest request){
IScenarioService<?> service = applicationContext.getBean(ScenarioServiceBeanNameFactory.getServiceBeanName(domain,action));
return Mono.just(ScenarioServiceInvoke.invoke(service,domain,action,this.buildMapFromWebRequest(request),request.getParameterMap()));
}
@PostMapping(value = "/xxx/{domain}/{action}")
public Mono<Object> invokeService(@PathVariable(name = "domain") String domain,@PathVariable(name = "action") String action,@RequestBody Map<String,Object> requestBody){
IScenarioService<?> service = applicationContext.getBean(ScenarioServiceBeanNameFactory.getServiceBeanName(domain,action));
return Mono.just(ScenarioServiceInvoke.invoke(service,domain,action,requestBody,null);
}
@PutMapping(value = "/xxx/{domain}/{action}")
public Mono<Object> invokeService(@PathVariable(name = "domain") String domain,@PathVariable(name = "action") String action,@RequestBody Map<String,Object> requestBody){
IScenarioService<?> service = applicationContext.getBean(ScenarioServiceBeanNameFactory.getServiceBeanName(domain,action));
return Mono.just(ScenarioServiceInvoke.invoke(service,domain,action,requestBody,null);
}
@DeleteMapping(value = "/xxx/{domain}/{action}")
public Mono<Object> invokeService(@PathVariable(name = "domain") String domain,@PathVariable(name = "action") String action,WebRequest request){
IScenarioService<?> service = applicationContext.getBean(ScenarioServiceBeanNameFactory.getServiceBeanName(domain,action));
return Mono.just(ScenarioServiceInvoke.invoke(service,domain,action,this.buildMapFromWebRequest(request),null));
}
private Map<String,Object> buildMapFromWebRequest(WebRequest request){
Map<String,Object> requestBody = new HashMap<String,Object>();
Map<String,String[]> parameterMap = request.getParameterMap();
Iterator<Entry<String,String[]>> it = parameterMap.entrySet().iterator();
Entry<String,String[]> entry = null;
while(it.hasNext()){
entry = it.next();
if(entry != null){
String key = entry.getKey();
String[] value = entry.getValue();
if(value != null && value.length > 0){
requestBody.put(key,value[0]);
}
}
}
return requestBody;
}
}
那么ScenarioServiceBeanNameFactory,该工厂类是如何获取service名称呢?上代码
public class ScenarioServiceBeanNameFactory{
public static String getServiceName(String domin,String action){
return domin+"."+action+".service";
}
}
从以上代码可以看出service类名称是类似于这种写法的:aaaa.bbbb.service
举例:在一个业务类的上面加上这个注释:@Component(aaa.bbb.service)。该注释创建一个bean,applicationContext.getBean()方法内传的值就是这些业务类bean。