2017-04-20 10 views
1

サービス間通信のロードバランシングに問題があります。クライアントの実行に失敗しました:java.lang.reflect.InvocationTargetException

私は春(1.4.2)、春の雲とnetflixOSSを使用しています。

私は2つのサービスshoppingcart-serviceとuser-serviceを持っています。ここ

はShoppingCartControllerはshopppingcartサービスアプリケーションからのものである:

@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 
} 

}

"チェックユーザー"

methosdはShoppingCartServiceクラスからのものである:

@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; 
} 

checkUser(userId)@HystricsCommandメソッドを実行しようとすると、java.lang.reflect.InvocationTargetExceptionが発生します。

お願いします。

UPDATE 1:

ショッピングカートサービスの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

例外をさらに追加してください。その一行は役に立たない。 – spencergibb

+0

スタックトレースは例外オブジェクト上で空です。また、コンソール上に出力がありません。私はまた、ユーレカとズールと共に3つのサービスをさらに実行しています。 shoppingcart-service用のpom.xmlを置いて、更新を見てください。 –

+0

サンプルを提供できない限り、私はどのように手助けするのか分かりません。 Camden.SR6はCamdenリリースの最新版です。 – spencergibb

答えて

0

Spring CloudFeignRibbonさておき、これらの "REST" エンドポイントは、推奨プラクティスに従っていないように見えます。

POSTユーザーが存在していないかどうかを確認するには、通常、ユーザーまたは製品などのリソースを作成するためにが使用されます。

POST〜/..../{userId}/createShoppingCartも正しく表示されません。名詞は、RESTで推奨されています。これらの "名詞"の操作は、/ User、/ products、/ users/{id}とHTTP動詞(POST、PUT、PATCH、DELETE、GET、....)で表されます。 PUT/products/{id}はIDが{id}の製品を更新することを意味します。動詞は通常URLの一部として推奨されません。

@spencergibbは、設定ファイル(application.ymlまたはproperties)なしで、ソースコードと意味のあるスタックトレースを使用すると、この問題のトラブルシューティングが非常に難しくなります。

pomファイルの<start-class>要素に<properties>が含まれていない可能性があります。

+0

HTTP APIの仕様は、ユーザーの大/小文字の区別とは異なります。しかし、これは今私が持っている問題と関連しています。 –

関連する問題