1

Feign クライアントに Spring Boot コントローラーを使用してもらい、それらの間のコントラクトを可能な限り共通のインターフェイスで指定するようにします。

メソッドとのインターフェースは次のようになります。

@RequestMapping
public interface RuleManager {

    @RequestMapping(value = "/addRule", method = RequestMethod.POST, consumes = {"application/json"}, produces = {"application/json"})
    @ResponseBody Rule addRule(@RequestBody Rule rule);
}

Feign クライアントは次のようになります。

@FeignClient(url = "http://localhost:8080")
public interface RuleManagerClient extends RuleManager { }

および Spring ブート コントローラー:

@RestController
public class RuleManagerService implements RuleManager {

    @Override
    @Transactional
    public Rule addRule(@RequestBody Rule rule) {
        return rule;
    }
}

@RequestMapping を 2 か所指定する必要がないのは良いことですが、残念ながら @RequestBody を 2 回指定する必要があるようです。@RequestBody がコントローラーまたは共有インターフェースから省略されている場合、Rule オブジェクトはインスタンス化されますが、すべてのメンバーが null に設定されます。

これを回避する方法はありますか?おそらく、これは新しいバージョンで対処されていますか? 私の依存関係は次のとおりです。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
        <exclusions>
            <exclusion>
                <groupId>com.netflix.feign</groupId>
                <artifactId>feign-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>com.netflix.feign</groupId>
        <artifactId>feign-core</artifactId>
        <version>8.14.3</version>
    </dependency>

この手法には少なくとも偽コア 8.6 が必要であることがわかりました。

https://jmnarloch.wordpress.com/2015/08/19/spring-cloud-designing-feign-client/

助けてくれてありがとう。

4

1 に答える 1

0

どうやらこれは機能します。@RequestBody は、共有インターフェイスに表示されるだけで済みます。問題は、コントローラーの application.properties に次のプロパティが設定されていたが、クライアントには設定されていなかったことです。

spring.jackson.property-naming-strategy=CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

そのため、オブジェクトはサーバー側でインスタンス化されましたが、すべてのメンバーが null でした。事実上、予期された「rule_name」ではなく「ruleName」など、間違ったプロパティがネットワーク経由で送信されました。

于 2016-02-05T01:22:00.153 に答える