[英]How to use mapstruct on the parent object to detect the right child mapper?
[英]how to use a child mapper method which extends a parent mapper
我試圖通過靈活的情況調用子映射器方法但是在這種情況下,我們不知道會調用哪個方法,即使它擴展了父映射器。 【帶有mybatis的spring boot框架】
// ParentMapper
public interface ParentMapper
{
// List<Map<String, String> findAll();
}
// Child1Mapper
public interface Child1Mapper extends ParentMapper
{
List<Map<String, String> findAll();
}
// Child2Mapper
public interface Child2Mapper extends ParentMapper{
List<Map<String, String> findAll();
}
@Autowired
Child1Mapper child1Mapper;
@Autowired
Child2Mapper child2Mapper;
// some class file
public ParentMapper getMapper(String param){
switch(param){
case "case1" : child1Mapper;
case "case2" : child2Mapper;
... 10 more..
}
}
public class example{
public void somethid(){
// this logic is in some biz
ParentMapper mapper = getMapper("case1"); // <----`-` we do not know where `findAll method` located is in
mapper.findAll();
}
}
如何調用子映射器方法
它在代碼中很清楚,如果您將case1
傳遞給getMapper(String param)
方法,它將返回return new Child1Mapper()
child1mapper 對象,因此如果您調用findAll()
方法,則將調用child1mapper
類的findAll()
方法
如果你通過case2
那么你會得到child2mapper
對象(which is like Parentmapper p = new Child2Mapper())
所以如果你調用findAll()
方法(p.findAll())
child2mapper findAll()
方法將被調用
child1mapper
和child2maper
都是的子類parentmapper
但沒有關系,船舶child1mapper
和child2mapper
所以沒有方法沖突的概念
你所做的一切都很好。
提供:您在這里指的是實際的實現類而不是接口
case "case1" : return new Child1Mapper();
case "case2" : return new Child2Mapper();
有趣的是:您剛剛在這里實現了一個設計模式。 您的getMapper
方法代表Factory Method Pattern
。 根據需要,這些類型的方法絕對有效。
關於Factory Method Pattern
更多信息: https : //www.tutorialspoint.com/design_pattern/factory_pattern.htm
TLDR:你缺少的方法簽名ParentMapper
public interface ParentMapper
{
List<Map<String, String>> findAll();
}
您需要為任何想要實現ParentMapper
接口的類指定共享方法簽名。 接口是實現的契約。
這將要求 Child1Mapper 和 Child2Mapper 提供該簽名的實現細節。
public interface ParentMapper
{
List<Map<String, String>> findAll();
}
// Child1Mapper
public class Child1Mapper implements ParentMapper
{
public List<Map<String, String>> findAll() { /* implementation */ }
}
// Child2Mapper
public class Child2Mapper implements ParentMapper{
public List<Map<String, String>> findAll() { /* implementation */ }
}
ParentMapper mapper = getMapper("child1"); mapper.findAll()
ParentMapper mapper = getMapper("child1"); mapper.findAll()
將使用Child1Mapper
實例的實現。
考慮到您使用的是 Spring,您也可以調整工廠方法以返回 Spring Bean。 例如:(這將取決於您如何連接彈簧豆)
@Bean
Child1MapperBean() { return new Child1Mapper() }
@Bean
Child2MapperBean() { return new Child2Mapper() }
public ParentMapper getMapper(String param){
switch(param){
case "case1" : return Child1MapperBean();
case "case2" : return Child2MapperBean();
}
}
我剛剛想通了......如果ParentMapper,ChildMappers 有相同的方法。 它運作良好。
或者我們可以考慮反射......像這樣。
Mapper mapper = getMapperClass(name);
Method method = mapper.getClass().getMethod(mapperQueryId, Map.class);
return (List<Map<String, Object>>) method.invoke(mapper, params);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.