当前位置: 首页 > 知识库问答 >
问题:

如何在Java中组合相似的接口?

彭坚壁
2023-03-14

在我的Java(Spring Boot)应用程序中,我有以下服务接口:

public interface PDFService {

    String createPdf(UUID uuid);
}

并将以下服务方法作为实现:

public class BrandPDFServiceImpl implements PDFService {

    private final BrandService brandService;

    @Override
    public String createPdf(UUID uuid) {
        Context context = new Context();

        BrandDTO brandDTO = brandService.findByUuid(uuid);
        context.setVariable("name", brandDTO.getName());
        context.setVariable("url", brandDTO.getImageUrl());
        setProductInformationToHtml(context, uuid);
        return templateEngine.process("template", context);
    }
}

现在我需要实现一个类似的服务,它将使用ProductService而不是BrandService:

public class ProductPDFServiceImpl implements PDFService {

    private final ProductService brandService;

    @Override
    public String createPdf(UUID uuid) {
        Context context = new Context();

        ProductDTO productDTO = productService.findByUuid(uuid);
        context.setVariable("name", productDTO.getName());
        context.setVariable("url", productDTO.getImageUrl());
        setProductInformationToHtml(context, uuid);
        return templateEngine.process("template", context);
    }
}

如果我使用这种方法,我无法从Controller调用正确的实现,如下所示:

private final PDFService pdfService;


public String createBrandPdf(@PathVariable UUID uuid) {
    return pdfService.createPdf(uuid);
}


// Note: I will add another endpoint for Product, 
// but still cannot differentiate which service will be called :( 

public String createProductPdf(@PathVariable UUID uuid) {
    return pdfService.createPdf(uuid); // ???
}

在这个场景中,我应该如何正确地合并这两个服务?我认为可能需要创建2个继承自PDFService的接口,但不确定是否有更好的方法,例如使用泛型或模板方法模式。知道吗?

共有1个答案

裴昕
2023-03-14

您可以使用限定符,在您的控制器类中,您可以声明两个服务引用,并且使用限定符,您可以告知SpringFramework您在这里需要的bean的确切类型,因此您可以像这样在控制器内使用这两个服务:

 @Qualifier("Brand")
 public class BrandPDFServiceImpl implements PDFService {
//...
}
@Qualifier("Product")
public class ProductPDFServiceImpl implements PDFService {
//...
}
private final PDFService brandService;
private final PDFService productService;

//  your Constructor here 
public MyController (@Qualifier("Brand")PDFService brandService, @Qualifier("Product")PDFService productService) { 
      this.productService = productService; 
      this.brandService = brandService; 
    }

public String createBrandPdf(@PathVariable UUID uuid) {
    return brandService.createPdf(uuid);
}


// Note: I will add another endpoint for Product, 
// but still cannot differentiate which service will be called :( 

public String createProductPdf(@PathVariable UUID uuid) {
    return productService.createPdf(uuid); // ???
}
 类似资料:
  • 问题内容: 我不知道如何很好地解释这一点,所以请多多包涵。 我试图对彼此相邻的相似行进行分组,如果相同,则基本上忽略第n + 1行。我不确定这在MySQL中是否容易实现。这些行除描述外不共享其他任何属性。如果还有其他不重复的“描述”,我仍然希望将它们返回。 我有一张桌子,上面满是这样的条目: 问题答案: 您可以使用巧妙的技巧来做到这一点。诀窍是计算与特定id 不同 的描述的数量。对于序列中的值,此

  • 问题内容: 我需要在基于Java的应用程序中使用Wordnet。我想要: 搜索同义词集 找到同义词集之间的相似性/相关性 我的应用程序使用RDF图,我知道Wordnet中有SPARQL端点,但是我想最好有一个数据集的本地副本,因为它不是太大。 我发现以下罐子: 通用库 -JAWS http://lyle.smu.edu/~tspell/jaws/index.html 通用库 -JWNL http:

  • 问题内容: 我有两个表的列相似-假设表A的列为LABEL_A,表B的列为LABEL_B。LABEL_A和LABEL_B的数据类型相同。 如何在单个查询中从两个表中选择LABEL?(因此,查询结果包含单个列LABEL,该列包含两个表的LABEL列中的数据)。 编辑:我可以在游标中使用这样的UNION查询吗? 感谢您的回答。 问题答案: 使用: 会更快,但是如果存在重复项,则不会删除重复项。如果要删除

  • 本文向大家介绍C ++中的相似字符串组,包括了C ++中的相似字符串组的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个字符串X和Y,如果可以交换X的两个字母,它们是相似的,因此等于Y。另外,如果两个字符串X和Y相等,则它们相似。例如,考虑两个字符串,例如“ tars”和“ rats”相似,如果我们交换t和r,则可以找到另一个,现在“ rats”和“ arts”相似,但是“ star”不同类

  • 如果有两个数组在swift中创建,如下所示: 如何将它们合并为< code>[1,2,3,4,5,6]?

  • 问题内容: 我有一些String []数组,例如: 如何混合它们,以便得到(a的0个元素,然后b,c,a,b,c的1个元素,依此类推)?谢谢 更准确地说,结果数组必须包含第一个数组的第一个值,然后是第二个数组的第一个值,…,最后一个数组的第一个值,第一个数组的第二个值,…,最后一个数组的第二个值,…,最大数组的最后一个值。如果数组的大小不同,则不会考虑较小的数组。 这是一个例子: 另外,我想结合可