Bonsoir,

je viens de développé un service rest qui gère les opérations crud qui concernent les clients.

Maintenant, je voudrais appeler mon service rest à partir de mon application Spring MVC, mais j'obtiens l'erreur suivante lorsque je clique sur le bouton "Mettre à jour" qui se trouve sur ma page JSP:


org.springframework.web.util.NestedServletException: Request processing failed; nested exception is
org.springframework.web.client.HttpClientErrorException: 400 null
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) cause mère
org.springframework.web.client.HttpClientErrorException: 400 null
org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94)
org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79)
org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:766)
org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:724)
org.springframework.web.client.RestTemplate.execute(RestTemplate.java:680)
org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:332)
com.luv2code.springdemo.service.CustomerServiceRestClientImpl.getCustomer(CustomerServiceRestClientImpl.java:59)
com.luv2code.springdemo.controller.CustomerController.showFormForUpdate(CustomerController.java:62)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
voici ma classe DemoAppConfig:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
 
package com.luv2code.springdemo.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
 
@Configuration
@EnableWebMvc
@ComponentScan("com.luv2code.springdemo")
@PropertySource({ "classpath:application.properties" })
public class DemoAppConfig implements WebMvcConfigurer {
 
    // define a bean for ViewResolver
 
    @Bean
    public ViewResolver viewResolver() {
 
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
 
        viewResolver.setPrefix("/WEB-INF/view/");
        viewResolver.setSuffix(".jsp");
 
        return viewResolver;
    }
 
    // define bean for RestTemplate ... this is used to make client REST calls
 
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
 
    // add resource handler for loading css, images, etc
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
          .addResourceHandler("/resources/**")
          .addResourceLocations("/resources/"); 
    }   
}

et voici mon fichier application.properties:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
#
# The URL for the CRM REST API
# - update to match your local environment
#
crm.rest.url=http://localhost:8080/spring-crm-rest/api/customers
et voici ma classe de service:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
package com.luv2code.springdemo.service;
 
import java.util.List;
import java.util.logging.Logger;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
 
import com.luv2code.springdemo.model.Customer;
 
@Service
public class CustomerServiceRestClientImpl implements CustomerService {
 
    private RestTemplate restTemplate;
 
    private String crmRestUrl;
 
    private Logger logger = Logger.getLogger(getClass().getName());
 
    @Autowired
    public CustomerServiceRestClientImpl(RestTemplate theRestTemplate, 
                                        @Value("${crm.rest.url}") String theUrl) {
        restTemplate = theRestTemplate;
        crmRestUrl = theUrl;
 
        logger.info("Loaded property:  crm.rest.url=" + crmRestUrl);
    }
 
    @Override
    public List<Customer> getCustomers() {
 
        logger.info("in getCustomers(): Calling REST API " + crmRestUrl);
 
        // make REST call
        ResponseEntity<List<Customer>> responseEntity = 
                                            restTemplate.exchange(crmRestUrl, HttpMethod.GET, null, 
                                                                  new ParameterizedTypeReference<List<Customer>>() {});
 
        // get the list of customers from response
        List<Customer> customers = responseEntity.getBody();
 
        logger.info("in getCustomers(): customers" + customers);
 
        return customers;
    }
 
    @Override
    public Customer getCustomer(int theId) {
 
        logger.info("in getCustomer(): Calling REST API " + crmRestUrl);
 
        // make REST call
        Customer theCustomer = 
                restTemplate.getForObject(crmRestUrl + "/" + theId, 
                                          Customer.class);
 
        logger.info("in saveCustomer(): theCustomer=" + theCustomer);
 
        return theCustomer;
    }
 
    @Override
    public void saveCustomer(Customer theCustomer) {
 
        logger.info("in saveCustomer(): Calling REST API " + crmRestUrl);
 
        int employeeId = theCustomer.getId();
 
        // make REST call
        if (employeeId == 0) {
            // add employee
            restTemplate.postForEntity(crmRestUrl, theCustomer, String.class);          
 
        } else {
            // update employee
            restTemplate.put(crmRestUrl, theCustomer);
        }
 
        logger.info("in saveCustomer(): success");  
    }
 
    @Override
    public void deleteCustomer(int theId) {
 
        logger.info("in deleteCustomer(): Calling REST API " + crmRestUrl);
 
        // make REST call
        restTemplate.delete(crmRestUrl + "/" + theId);
 
        logger.info("in deleteCustomer(): deleted customer theId=" + theId);
    }
 
}
et voici mon controller qui se trouve dans mon app rest :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
 
package com.luv2code.springdemo.rest;
 
import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import com.luv2code.springdemo.entity.Customer;
import com.luv2code.springdemo.service.CustomerService;
 
@RestController
@RequestMapping("/api")
public class CustomerRestController {
 
 
    // importer la depende du service
 
    @Autowired
    private CustomerService customerService;
 
    // ajout de la methode qui permet de récupérer les customers (clients)
 
    @GetMapping("/customers")
    public List<Customer> getCustomers(){
 
 
        return customerService.getCustomers();
    }
 
 
    // récupérer un seul customer avec un id donné en parametre
 
    @GetMapping("/customer/{customerId}")
    public Customer getCustomer(@PathVariable int customerId) {
 
        Customer theCustomer = customerService.getCustomer(customerId);
 
        if(theCustomer == null) {
            throw new CustomerNotFoundException("Le client avec l'id :"+ customerId + " n'est pas trouvé");
        }
 
 
        return theCustomer;
    }
 
    // ajouter la méthode d'ajout d'un nouveau customer
 
    @PostMapping("/customers")
    public Customer addCustomer(@RequestBody  Customer theCustomer) {
 
        theCustomer.setId(0);
 
        customerService.saveCustomer(theCustomer);
 
        return theCustomer;
    }
 
 
    // modification d'un customer existent :
 
    @PutMapping("/customers")
    public Customer updateCustomer(@RequestBody  Customer theCustomer) {
 
 
 
        customerService.saveCustomer(theCustomer);
 
        return theCustomer;
    }
 
    // delete un customer en fonction de l'id donné :
 
    @DeleteMapping("/customers/{customerId}")
    public String DeleteCustomer(@PathVariable int customerId) {
 
        Customer theCustomer = customerService.getCustomer(customerId);
 
        if(theCustomer == null) {
            throw new CustomerNotFoundException("le customer avec l'id donnée n'a pas été trouvé");
        }
 
        customerService.deleteCustomer(customerId);;
 
        return "le client avec l'id" + customerId + " a été supprimé";
    }
 
}
voici le lien drive pour ceux qui veulent tester mon application:

https://drive.google.com/open?id=1Hk...VdLbotWzn1Cvx1

quelqu'un peut-il m'aider s'il vous plaît?