java - 如何创建通过调用外部端点返回响应实体的端点

标签 java spring rest

我在一个应用程序中有一个端点,我想在另一个应用程序中创建端点,该应用程序将调用第一个端点。

第一个是

@AllArgsConstructor
@RestController
@RequestMapping(PASSWORD_RESET)
public class ResetPasswordController {
    private final ResetPasswordService passwordService;
    private final AgentUtils agentUtils;
    private final ObjectMapper objectMapper;

    @PostMapping(SEND_CODE)
    @HasPermission(Permission.PUBLIC)
    @ApiOperation(value = "Sending password reset code",
            notes = "Validate request. Generates a random 6 digit value and send it as an SMS to the agent.",
            code = 200, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<String> sendPasswordResetCode(@RequestHeader(HEADER_TENANT_ID) Long tenantId,
            @Valid @RequestBody SendResetPasswordCodeReqDto sendResetPasswordCodeReqDto) {

        if (!passwordService.isAgentExist(tenantId, sendResetPasswordCodeReqDto.getSocialId(),
                sendResetPasswordCodeReqDto.getPhone())) {
            return ResponseEntity.notFound().build();
        }
        passwordService.sendPasswordResetCode(tenantId, sendResetPasswordCodeReqDto);
        return ResponseEntity.ok().build();
    }

我正在尝试创建的服务

@Service
@Slf4j
public class ResetPasswordService{
    private static final String RESET_PASSWORD_URL = "/password-reset";

    public ResetPasswordService(SettingsService settingsService,
            RestTemplate restTemplate,
            MicroServicesHeadersService loginHeadersService) {
        super(settingsService, restTemplate, loginHeadersService);
    }

    public String sendPasswordResetCode(Long tenantId, SendResetPasswordCodeReqDto sendResetPasswordCodeReqDto) {
       try {
           String responseFromExtService = postToExtServices(
                   sendResetPasswordCodeReqDto, SEND_CODE_URL, new ParameterizedTypeReference<String>() {}
           ).getBody();
           return responseFromExtService;
       } catch (Exception e) {
           log.error("Failed to get password reset code");
           throw e;
       }
    }

@SneakyThrows
    public <T> ResponseEntity<T> postToExtServices(Object dto, String url, ParameterizedTypeReference<T> responseType) {
        String jsonBody = objectMapper.writeValueAsString(dto);
        HttpEntity<String> request = new HttpEntity<>(jsonBody, httpHeadersService.getDefaultHttpHeaders());

        return restTemplate.exchange(
                getResourceUrl() + url,
                HttpMethod.POST,
                request,
                responseType
        );
    } 

问题是,在我当前的实现中,sendPasswordResetCode() 的返回类型是 String,我希望将其更改为 ResponseEntity<String>就像第一个端点一样。不确定我是否必须更改我的 postToExtServices()或者我应该更改 sendPasswordResetCode()

最佳答案

一开始我误解了你的问题。

你的意思是:

ResetPasswordController 托管在应用程序 A 中。 ResetPasswordService 托管在应用程序 B 中,但会在 postToExtServices 方法中调用应用程序 A?

如果是这种情况,我建议 sendPasswordResetCode 不会返回 ResponeEntityResponseEntities 通常由应用程序的 Controller 层使用。

尝试隔离其所属图层中的每个对象,如下所示: enter image description here

关于java - 如何创建通过调用外部端点返回响应实体的端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59543827/

相关文章:

java - 有关 Spring MVC 消息转换器的一些信息?

java - Spring STS 挂起的原因可能是什么?

spring - SpringMVC中Model和HttpServletRequest的用法有什么区别? HttpServletRequest可以完全替代Model吗?

java - 使用java获取REST Web服务中http请求的内容

java - 你如何测试多个 REST 请求?

Java:写入期间意外退出

java - 直接从intelliJ在系统终端上运行java程序?

java - Spring安全未授权用户

java - 如何在单元测试中设置Spring注入(inject)的值?

facebook - 上传照片 Rest API 而不张贴到墙上