我有一个服务,它从用户输入中获取一个url,提取这个url的主体内容,应用css,最后以流的形式返回结果。
棘手的部分是,我根据url有不同的实现,如果url无法识别,则使用“默认”实现。为此,我使用了一个策略模式来选择正确的运行时实现。
@Component
public class HtmlToHtmlServiceFactory {
private final List<HtmlToHtmlService> services;
@Autowired
public HtmlToHtmlServiceFactory(List<HtmlToHtmlService> services) {
this.services = services
}
public HtmlToHtmlService getHtmlToHtmlImpl(String url) {
return services.stream()
.filter(service -> service.supportsUrl(url))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException(String.format("No service found that supports [%s]", url)));
}
}
但是,由于某些原因,我必须使用结构模式。我认为装饰图案是最合适的。否则我也在考虑一种自我注册模式。
我还以为 @PostConstruct
注解对于初始化bean可能很有用,但是如何使用它Map服务呢?
编辑:
我做这个编辑,因为它似乎我没有解释好。我只有一个控制器接收包含字符串的多部分文件(这是我要解析的网站的url)
@PostMapping(value = "/website",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.TEXT_HTML_VALUE)
public ResponseEntity<InputStreamResource> parseUrl(@RequestParam String url) throws IOException {
InputStream parsedFile = htmlToHtmlServiceFactory.getHtmlToHtmlImpl(url).htmlToHtml(url);
InputStreamResource inputStreamResource = new InputStreamResource(parsedFile);
return ResponseEntity.ok(inputStreamResource);
}
1条答案
按热度按时间qgelzfjb1#
听起来你想要的是mvc模式和springmvc。您还可以查看webflux的异步。
如果你说的是微服务,你应该看看SpringCloudGateway、服务注册和发现以及断路器。
我会做如下的事情。
控制器:
控制器建议
服务:
查看/url/that/you/configured.html:
编辑:
你说的是正则表达式吗?
像这样:
正如@tgdavies所说: