Mon service Web utilise un autre service Web. dans mon service web, je modifie certains champs du json. puis dans le facteur il est consommé ok. Je dois maintenant convertir ResponseEntity en fichier .json pour l'enregistrer dans un dossier sur mon ordinateur, mais la tentative a échoué.

Des idées?

Mon contrôleur actuel:

@Controller
public class SiviccController {

    private final Logger log = LoggerFactory.getLogger(SiviccController.class);
    private String url = "http://localhost:9090/url_1";

    @GetMapping("/url_2")
    @ResponseBody
    public Body sivicc() {
        RestTemplate restTemplate = new RestTemplate(Factory.timeoutHttp());
        try {
            return restTemplate.getForObject(url, Body.class);
        } catch (Exception e) {
            Body body = new Body();
            body.setIserror(true);
            log.info(e.getMessage());
            return body;
        }
    }
}

Matheus Cirillo fonctionne parfaitement avec le code suivant:

@Controller
public class SiviccController {

    private final Logger log = LoggerFactory.getLogger(SiviccController.class);
    private String url = "http://localhost:9090/url_1";

    @GetMapping("/url_2")
    @ResponseBody
    public Body sivicc() {
        RestTemplate restTemplate = new RestTemplate(Factory.timeoutHttp());
        try {
            String response = restTemplate.getForObject(url, String.class);
            BufferedWriter writer = new BufferedWriter(new FileWriter("my-file.json", true));
            writer.append(response);
            writer.close();
            return restTemplate.getForObject(url, Body.class);
        } catch (Exception e) {
            Body body = new Body();
            body.setIserror(true);
            log.info(e.getMessage());
            return body;
        }
    }
}

Cependant, le service Web que vous utilisiez auparavant génère maintenant un jeton. C'est pourquoi je change getForObject en échange et je le consomme bien, mais j'applique la même logique pour enregistrer le json dans un dossier sur mon ordinateur, mais cela génère un échec en deux lignes:

@Controller
public class SiviccController {

    private final Logger log = LoggerFactory.getLogger(SiviccController.class);
    private String url = "http://localhost:9090/url_1";

    @GetMapping("/url_2")
    @ResponseBody
    public Body sivicc() {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        headers.set("Authorization", "bearer 8P7oM_ZDhB3TYolVkB1MLtM734DrrUSMVEFuiy3u");
        HttpEntity request = new HttpEntity(headers);               
        headers.add("User-Agent", "Spring's RestTemplate" );
        ResponseEntity<String> response = restTemplate.exchange(
                url,
                HttpMethod.GET,
                request,
                //Body.class,
                String.class,
                1
        );
  
        try {   
            BufferedWriter writer = new BufferedWriter(new FileWriter("my-file.json", true));
            writer.append(response);//Error: The method append(CharSequence) in the type Writer is not applicable for the arguments (ResponseEntity<String>)
            writer.close();
            return response.getBody();//Error: Type mismatch: cannot convert from String to Body
            
        } catch (Exception e) {
            Body body = new Body();
            body.setIserror(true);
            log.info(e.getMessage());
            return body;
        }
    }
}
0
Dante 27 août 2020 à 02:00

2 réponses

Meilleure réponse

Changez le type de réponse de getForObject à String.class, puis utilisez BufferedWriter pour écrire le fichier.

RestTemplate rest = new RestTemplate();
String response = rest.getForObject("http://example.com/", String.class);

BufferedWriter writer = new BufferedWriter(new FileWriter("my-file.json", true));
writer.append(response);
writer.close();

Modifier

Le RestTemplate # exchange renvoie un ResponseEntity<T>, pas un String.

Dans votre cas, il renverra un ResponseEntity<String>.

C'est pourquoi vous ne pouvez pas écrire l'objet. Pour ce faire, vous devez récupérer le corps de l'objet ResponseEntity. Utilisez la méthode ResponseEntity # getBody

Quelque chose comme ça:

ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class, 1);

BufferedWriter writer = new BufferedWriter(new FileWriter("my-file.json", true));
// here you are getting the String with the response.getBody() method,
// so buffered writer can write the file
writer.append(response.getBody());
writer.close();
0
Matheus Cirillo 27 août 2020 à 12:41

Résolue:

Ajouter à pom.xml:

<dependencies>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>
</dependencies>
  1. Utilisez la classe ObjectMapper de l'API Jackson pour convertir l'objet Java en chaîne JSON
  2. Utilisez BufferedWriter pour écrire le fichier. @Matheus Cirillo
ObjectMapper mapper = new ObjectMapper();
        try {
          json = mapper.writeValueAsString(response.getBody());
          System.out.println("ResultingJSONstring = " + json);
          BufferedWriter writer = new BufferedWriter(new FileWriter("my-file.json", true));
        writer.append(json);
        writer.close();
        } catch (JsonProcessingException e) {
           e.printStackTrace();
        }

Merci pour votre aide =)

0
Dante 27 août 2020 à 23:43