私はSpringブート1.5.4、Spring Data REST、HATEOASを使用しています。私はAngularクライアントからRESTエンドポイントを使用することを公開しています。SpringデータRESTリポジトリのEnum変換
私はspring.data.rest.enable-enum-translation=true
を使用してenumを変換しています。それは、GET
とPOST
の両方のリクエストが、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[]
に変換することができませんいくつかの理由について
- を
List<TransitCertificateStatus>
値がTransitCertificateStatus(Pending、USED、CANCELED、ARCHIVED)で定義されている値であっても、 - クライアントが送信する文字列を、正しいenumに変換することはできません。
rest-messages.properties
(P終了、使用済みなど)。
SpringデータRESTの内部機能を使用するエレガントな方法です(私は列挙型変換がsave()メソッドで動作することを指摘しています)。
[@ Annotatiomania™](http://www.annotatiomania.com/); – sp00m
クライアントから「USED」を送信していますか? rest-message.propertiesマッピングには「Used」が含まれています。 – raiyan
@RaiyanMohammed私は両方の方法で試しました。とにかく私はsave()メソッドのように両方の方法で動作すると期待しています。 – drenda