2017-04-20 2 views
1

Ich habe ein Problem beim Datenaustausch zwischen Diensten.Fehler bei der Ausführung der Clientausführung: java.lang.reflect.InvocationTargetException

Ich verwende Feder (1.4.2), Feder Wolke mit NetflixOSS.

Ich habe zwei Dienste shoppingcart-service und user-service. Hier

ist ShoppingCartController von shopppingcart-Service App:

@RestController 
@RequestMapping("shoppingCarts") 
public class ShoppingCartController extends AbstractRESTController<ShoppingCart, String>{ 

private ShoppingCartService shoppingCartSrevice; 

@Autowired 
public ShoppingCartController(ShoppingCartService service) { 
    super(service); 
    this.shoppingCartSrevice = service; 
} 

@RequestMapping(value = "{userId}/createShoppingCart", method = RequestMethod.POST) 
ShoppingCart createShoppingCart(
     @RequestBody List<CartItem> items, 
     @PathVariable(name = "userId") String userId 
     ){ 

    Boolean userOK = shoppingCartSrevice.checkUser(userId); 

    if(userOK != null) 
     if(userOK) 
      return shoppingCartSrevice.createShoppingCart(items, userId); 

    return null; 
} 

@FeignClient("user-service")//the server.port property name, for the "server" service 
public interface UserServiceClient { 
    @RequestMapping(value = "users/checkUser", method = RequestMethod.POST)// the endpoint which will be balanced over 
    Boolean checkUser(
      @RequestParam(name = "userId") String userId);// the method specification must be the same as for users/hello 
} 

}

"Checkuser"

methosd ist aus ShoppingCartService Klasse:

@Service 
public class ShoppingCartService extends AbstractCRUDService<ShoppingCart, String>{ 

private ShoppingCartRepository shoppingCartRepository; 
private RestTemplate restTemplate; 

@Autowired 
private UserServiceClient userServiceClient;// feign client 

@Autowired 
public ShoppingCartService(ShoppingCartRepository repo, RestTemplate restTemplate) { 
    super(repo); 
    this.shoppingCartRepository = repo; 
    this.restTemplate = restTemplate; 

} 

/** 
* Method checks if the given user is registered and active 
* We use Ribbon and Feign to get data from user-service, load-balancing 
* @param userId 
* @return 
*/ 
@HystrixCommand(fallbackMethod="fallbackCheckUser") 
public Boolean checkUser(String userId) { 

    /*USING LOAD-BALANCING*/ 
    Boolean resp = userServiceClient.checkUser(userId);//HERE I GET THE EXCEPTION 
    return resp; 
} 

public Boolean fallbackCheckUser(String userId){ 
    return true; 
} 

Wenn ich versuche, die @HystricsCommand Methode checkUser (userId) auszuführen, bekomme ich: java.lang.reflect.InvocationTargetException.

Bitte helfen.

UPDATE 1:

Warenkorb-Service pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>rs.uns.acs.ftn</groupId> 
    <artifactId>ShoppingCartService</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>ShoppingCartService</name> 
    <description>Shopping Cart Service</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.2.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-feign</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-hystrix</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-ribbon</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-eureka</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-mongodb</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.jglue.fluent-json</groupId> 
      <artifactId>fluent-json</artifactId> 
      <version>2.0.3</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.springframework.cloud</groupId> 
       <artifactId>spring-cloud-dependencies</artifactId> 
       <version>Camden.SR2</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 


</project> 
+0

Bitte fügen Sie weitere Ausnahmen hinzu. Diese einzelne Zeile ist nutzlos. – spencergibb

+0

Die Stack-Trace ist leer auf Ausnahme-Objekt, auch ich bekomme keine Ausgabe auf der Konsole. Ich habe auch 3 weitere Dienste neben Eureka und Zuul. Ich werde pom.xml für den shoppingcart-service einstellen, siehe update. –

+0

Ich kann nicht helfen, es sei denn, Sie können eine Probe zur Verfügung stellen. Camden.SR6 ist das Neueste im Camden Release-Zug. – spencergibb

Antwort

0

Spring Cloud, Feign, Ribbon beiseite diese "REST" Endpunkte scheinen nicht empfohlenen Verfahren zu folgen.

POST um zu überprüfen, ob ein Benutzer existiert, sieht nicht richtig aus, POST werden normalerweise verwendet, um eine Ressource wie einen Benutzer oder ein Produkt zu erstellen.

POST zu /..../{userId}/createShoppingCart sieht auch nicht richtig aus. Substantive werden empfohlen in REST API Design,/Benutzer,/Produkte,/Benutzer/{ID} und HTTP-Verben (POST, PUT, PATCH, DELETE, GET, ....) repräsentieren Operationen auf diese "Substantive": POST/Benutzer bedeutet, einen Benutzer zu erstellen, PUT/products/{id} bedeutet Update-Produkt mit der ID {id}. Verben werden normalerweise nicht als Teil der URL empfohlen.

Und als @spencergibb erwähnt, ohne die Konfigurationsdateien (application.yml oder Eigenschaften), den Quellcode und sinnvolle Stacktrace wäre es sehr schwierig, dieses Problem zu beheben.

Ein mögliches Problem könnte sein pom Datei fehlt das <start-class> Element innerhalb <properties>.

+0

Die HTTP-API-Spezifikation unterscheidet sich von Benutzerfall zu Anwendungsfall. Aber das hat etwas mit dem Problem zu tun, das ich gerade habe. –

Verwandte Themen