2017-07-14 7 views
1

私はSpringブート1.5.4、Spring Data REST、HATEOASを使用しています。私はAngularクライアントからRESTエンドポイントを使用することを公開しています。SpringデータRESTリポジトリのEnum変換

私はspring.data.rest.enable-enum-translation=trueを使用してenumを変換しています。それは、GETPOSTの両方のリクエストが、SpringデータRESTからリポジトリに公開されている場合にうまく機能します。

Iは、リポジトリ内のカスタムメソッドを追加した:

@Transactional(readOnly = true) 
@PreAuthorize("isAuthenticated()") 
public interface TransitCertificateRepository extends PagingAndSortingRepository<TransitCertificate, Long> { 

    @Query("SELECT t FROM TransitCertificate t WHERE :states IS NULL OR status IN (:states) ") 
    public Page<TransitCertificate> findAllByParameters(
      @Param("states") @RequestParam(value = "states", required = false) List<TransitCertificateStatus> states, Pageable pageable); 

これは列挙である:

public enum TransitCertificateStatus { 
     PENDING, USED, CANCELED, ARCHIVED 
    } 

これはモデルの関連部分である:rest-messages.properties

@Entity 
@EntityListeners(TransitCertificateListener.class) 
public class TransitCertificate extends AbstractEntity { 
    private static final long serialVersionUID = 5978999252424024545L; 

    @NotNull(message = "The status cannot be empty") 
    @Column(nullable = false) 
    @Enumerated(EnumType.STRING) 
    private TransitCertificateStatus status = TransitCertificateStatus.PENDING; 

列挙型の翻訳は次のとおりです:

server.model.enums.TransitCertificateStatus.PENDING = Pending 
server.model.enums.TransitCertificateStatus.USED = Used 

クライアントが私のメソッドfindAllByParametersを呼び出そうとし、Stringの配列(サーバーの返信方法に変換されたもの)を送信すると、サーバー上の変換は失敗します。 なぜ変換がsave()メソッドで動作するのか分かりませんが、私のメソッドではそうではありません。 Furthemoreクライアントは私に2つの状態を送信する場合、春はこのエラーを返します。

Parameter value element [USED] did not match expected type [server.model.enums.TransitCertificateStatus (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value element [USED] did not match expected type [server.model.enums.TransitCertificateStatus (n/a)] 

だから私は、私は二つの問題まし推測:春はString[]に変換することができませんいくつかの理由について

  1. List<TransitCertificateStatus>値がTransitCertificateStatus(Pending、USED、CANCELED、ARCHIVED)で定義されている値であっても、
  2. クライアントが送信する文字列を、正しいenumに変換することはできません。 rest-messages.properties(P終了、使用済みなど)。

SpringデータRESTの内部機能を使用するエレガントな方法です(私は列挙型変換がsave()メソッドで動作することを指摘しています)。

+1

[@ Annotatiomania™](http://www.annotatiomania.com/); – sp00m

+0

クライアントから「USED」を送信していますか? rest-message.propertiesマッピングには「Used」が含まれています。 – raiyan

+0

@RaiyanMohammed私は両方の方法で試しました。とにかく私はsave()メソッドのように両方の方法で動作すると期待しています。 – drenda

答えて

1

私はこの方法で問題を解決することになった:

  • 私は、私は文字列のようなクライアントからの列挙型を取得
  • 私の方法を作成し、I
  • @RepositoryRestControllerカスタムを作成それを変換する。あなたはこの方法でenumTranslationを注入する必要が

    @PostMapping(path = "/licensePlates/searches") 
        public ResponseEntity<?> search(@RequestBody(required = true) List<Filter> filters, Pageable pageable, Locale locale, 
          PersistentEntityResourceAssembler resourceAssembler) { 
    EngineType engineType = enumTranslator.fromText(EngineType.class, filterMap.get("engineType")); 
    

    @Autowired 
    private EnumTranslator enumTranslator; 
    

    ない。このように、クライアントは、このコードの一部も列挙

のための変換された文字列を送信することができます確かに最良の方法ですが、それは小さなコードで私の問題を解決しました。

関連する問題