feat: add MapStruct mapping samples to ToolScaffolder template

This commit is contained in:
jade
2026-07-22 11:22:36 +09:00
parent 1796370a35
commit e983b47af6

View File

@@ -103,6 +103,7 @@ public class ToolScaffolder {
package %s.dto; package %s.dto;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import %s.annotation.McpParameter;
import lombok.Data; import lombok.Data;
/** /**
@@ -122,9 +123,13 @@ public class ToolScaffolder {
@Data @Data
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class %sReq { public class %sReq {
// TODO: Add request fields here @McpParameter(description = "수신자 전화번호", required = true)
private String phoneNumber;
@McpParameter(description = "전송할 메시지 내용", required = true)
private String message;
} }
""".formatted(BASE_PACKAGE, BASE_PACKAGE, baseName, author, createDate, createDate, author, baseName); """.formatted(BASE_PACKAGE, BASE_PACKAGE, BASE_PACKAGE, baseName, author, createDate, createDate, author, baseName);
Files.writeString(dtoDir.resolve(baseName + "Req.java"), reqContent); Files.writeString(dtoDir.resolve(baseName + "Req.java"), reqContent);
// Generate Res DTO // Generate Res DTO
@@ -177,6 +182,9 @@ public class ToolScaffolder {
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.Map; import java.util.Map;
import org.mapstruct.factory.Mappers;
import %s.converter.%sLegacyConverter;
import %s.legacy.%sLegacyReq;
/** /**
* @package %s.service * @package %s.service
@@ -202,6 +210,7 @@ public class ToolScaffolder {
public class %sService { public class %sService {
private final AxhubMciComponent mci; private final AxhubMciComponent mci;
private final %sLegacyConverter converter = Mappers.getMapper(%sLegacyConverter.class);
@McpFunction( @McpFunction(
displayName = "%s 툴", displayName = "%s 툴",
@@ -216,10 +225,13 @@ public class ToolScaffolder {
public Object execute(%sReq req) { public Object execute(%sReq req) {
log.info("[MCI Tool] {} 요청 수신.", "%s"); log.info("[MCI Tool] {} 요청 수신.", "%s");
try { try {
// MapStruct를 이용한 자동 매핑 (AI DTO -> MCI DTO)
%sLegacyReq legacyReq = converter.toLegacyReq(req);
Transfer<Object> resTransfer = mci.callTo( Transfer<Object> resTransfer = mci.callTo(
"%s", "%s",
null, null,
req, legacyReq,
Object.class Object.class
); );
return resTransfer.getBody() != null ? resTransfer.getBody() : Map.of("status", "SUCCESS"); return resTransfer.getBody() != null ? resTransfer.getBody() : Map.of("status", "SUCCESS");
@@ -236,14 +248,19 @@ public class ToolScaffolder {
BASE_PACKAGE, baseName, BASE_PACKAGE, baseName,
BASE_PACKAGE, baseName, BASE_PACKAGE, baseName,
BASE_PACKAGE, baseName, BASE_PACKAGE, baseName,
BASE_PACKAGE, baseName,
BASE_PACKAGE, baseName,
author, author,
createDate, createDate,
createDate, author, createDate, author,
routingType, group.toLowerCase(), routingType, group.toLowerCase(),
baseName, baseName,
baseName, baseName,
baseName, toolName, description, description + " 해줘.", interfaceId, register, baseName, toolName, description, description + " 해줘.", interfaceId, register,
baseName, baseName,
baseName, interfaceId baseName,
baseName,
interfaceId
); );
} else { } else {
serviceContent = """ serviceContent = """
@@ -337,7 +354,15 @@ public class ToolScaffolder {
*/ */
@Data @Data
public class %sLegacyReq { public class %sLegacyReq {
// TODO: Add legacy request fields here /**
* EAI 시스템이 요구하는 수신자 번호 파라미터명
*/
private String phone;
/**
* EAI 시스템이 요구하는 메시지 내용 파라미터명
*/
private String content;
} }
""".formatted(BASE_PACKAGE, BASE_PACKAGE, baseName, author, createDate, createDate, author, baseName); """.formatted(BASE_PACKAGE, BASE_PACKAGE, baseName, author, createDate, createDate, author, baseName);
Files.writeString(legacyDtoDir.resolve(baseName + "LegacyReq.java"), legacyReqContent); Files.writeString(legacyDtoDir.resolve(baseName + "LegacyReq.java"), legacyReqContent);
@@ -396,9 +421,15 @@ public class ToolScaffolder {
@Mapper(componentModel = "spring") @Mapper(componentModel = "spring")
public interface %sLegacyConverter { public interface %sLegacyConverter {
@Mapping(source = "phoneNumber", target = "phone")
@Mapping(source = "message", target = "content")
%sLegacyReq toLegacyReq(%sReq req); %sLegacyReq toLegacyReq(%sReq req);
%sRes toRes(%sLegacyRes legacyRes); @Mapping(source = "phone", target = "phoneNumber")
@Mapping(source = "content", target = "message")
%sReq toReq(%sLegacyReq legacyReq);
// %sRes toRes(%sLegacyRes legacyRes);
} }
""".formatted( """.formatted(
BASE_PACKAGE, BASE_PACKAGE,