카테고리 없음

Spring Java에서 @GetMapping을 API에 사용하려고 할 때 빈 JSON이 반환되었습니다.

기록만이살길 2021. 3. 1. 01:05
반응형

Spring Java에서 @GetMapping을 API에 사용하려고 할 때 빈 JSON이 반환되었습니다.

1. 질문(문제점):

JIRA API에서 가져온 JSON 데이터를 반환하는 로거가있는 @Bean이 있습니다. 현재 프로그램을 시작하는 동안 내 응답을 기록하고 있습니다. 이제 컨트롤러에서 @GetMapping 사용을 시작하고 localhost : 8080 /에서 GET 요청을 할 때마다 정보를 기록하고 싶습니다.

이것은 컨트롤러 클래스의 @Bean이며 @GetMapping으로 변경하고 싶습니다.

  @Bean
    public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
        return args -> {
            IssuesList response = restTemplate.getForObject(
                    "https://.../rest/api/2/search?jql=project="+projectId+" AND status in (done) AND issueType in (Story)&expand=changelog",
                    IssuesList.class);


            List<Issues> issuesData = response.getIssuesList();

            log.info(issuesData.toString());
        };
    }

이것은 내 RestTemplate @Bean입니다.

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.basicAuthentication(auth,auth2).build();
    }

프로그램을 시작할 때받는 응답입니다.

[{key= 'PE-1322', fields= {storyPoints= '3', issueType= 'Story', created= '2020-11-18T09:16:55.816+0000'}}]

CommandLineRunner에서 @Bean을 @GetMapping으로 변경하려고 시도했지만 그렇게하면이 응답 만 얻습니다.

2021-01-15 16:08:59.261  INFO 36704 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-01-15 16:08:59.261  INFO 36704 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-01-15 16:08:59.261  INFO 36704 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms

그리고 localhost : 8080에서 빈 JSON {}을 얻습니다.

# 편집 : 이것은 내 전체 컨트롤러 클래스입니다.


@RestController
public class Controller {

    private String auth = "...";
    private String auth2 = "...";
    private String projectId = "...";


    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.basicAuthentication(auth,auth2).build();
    }

    @Bean
    public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
        return args -> {
            IssuesList response = restTemplate.getForObject(
                    "https://.../rest/api/2/search?jql=project="+projectId+" AND status in (done) AND issueType in (Story)&expand=changelog",
                    IssuesList.class);


            List<Issues> issuesData = response.getIssuesList();

            log.info(issuesData.toString());
        };
    }
}

@GetMapping으로 편집 된 버전입니다.

@RestController
public class Controller {

    private String auth = "...";
    private String auth2 = "...";
    private String projectId = "...";
    private static final Logger log = LoggerFactory.getLogger(KpiMetricsApplication.class);


    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.basicAuthentication(auth,auth2).build();
    }

    @GetMapping("/")
    public String run(RestTemplate restTemplate) throws Exception {
            IssuesList response = restTemplate.getForObject(
                    "https://.../rest/api/2/search?jql%3Dproject%3D"+projectId+"%20AND%20status%20in%20(done)%20AND%20issueType%20in%20(Story)&expand%3Dchangelog",
                    IssuesList.class);


            List<Issues> issuesData = response.getIssuesList();

            return issuesData.toString();
    }
}


# 최종 편집

@sarcode 덕분에 해냈습니다. 업데이트 된 수업은 다음과 같습니다.

먼저 Resttemplate 구성 클래스를 만들었습니다.


@Configuration
@Slf4j
public class RestConfig {

    private String auth = "...";
    private String auth2 = "...";

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.basicAuthentication(auth,auth2).build();
    }

    @Bean
    public CommandLineRunner startup() {
        return args -> {
            log.info("**************************************");
            log.info("    Configuring with RestTemplate");
            log.info("**************************************");
        };
    }
}

그리고 이와 같이 컨트롤러 클래스를 업데이트했는데 작동하게 만든 것은 @Autowired 주석이었습니다.


@RestController
public class Controller {

    private static final Logger log = LoggerFactory.getLogger(KpiMetricsApplication.class);


    private String projectId = "...";

    @Autowired
    private RestTemplate rest = new RestTemplate();


    @GetMapping("/")
    public String run() throws Exception {
            IssuesList response = rest.getForObject(
                    "https://.../rest/api/2/search?jql=project="+projectId+ " AND status in (done) AND issuetype in (Story)&expand=changelog",
                    IssuesList.class);


            List<Issues> issuesData = response.getIssuesList();

            log.info(issuesData.toString());
            return response.toString();
    }
}

2. 해결방안:

말했듯이 @GetMapping이있는 간단한 RestController가 필요합니다.

@RestController
public class SimpleController {

   

    @GetMapping("/")
    public String check() {
        IssuesList response = restTemplate.getForObject(
                "https://.../rest/api/2/search?jql=project="+projectId+" AND status in (done) AND issueType in (Story)&expand=changelog",
                IssuesList.class);


        List<Issues> issuesData = response.getIssuesList();
        return issuesData.toString();

    }
}

참고로 RestTemplate Config를 다른 곳에 배치하는 것이 좋습니다.

65738582
반응형