我正在使用Spring Boot 1.5.4,Spring Data REST,HATEOAS . 我正在公开要从Angular客户端使用的REST endpoints .
我正在使用 spring.data.rest.enable-enum-translation=true
来转换枚举 . 它在从存储库中从Spring Data REST公开的 GET
和 POST
请求中都可以正常工作 .
我在存储库中添加了一个自定义方法:
@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
}
这是模型的相关部分:
@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;
在 rest-messages.properties
我翻译的枚举像:
server.model.enums.TransitCertificateStatus.PENDING = Pending
server.model.enums.TransitCertificateStatus.USED = Used
当客户端尝试调用我的方法 findAllByParameters
并发送一个String数组(翻译服务器发回的方式)时,服务器上的转换失败 . 我不明白为什么转换在save()方法中工作,例如,但不在我的方法中 . 更进一步,如果客户端发送给我2个状态,Spring返回此错误:
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)]
所以我想我有两个问题:
-
由于某种原因,Spring无法将
String[]
转换为List<TransitCertificateStatus>
,即使该值正好是TransitCertificateStatus中定义的值(PENDING,USED,CANCELLED,ARCHIVED) -
当值为
rest-messages.properties
(Pending,Used等)中定义的值之一时,Spring无法将客户端发送的String转换为右枚举 .
有没有办法解决问题是一种优雅的方式使用Spring Data REST的内部工具(我指出enum transation在save()方法中工作)而不重新发明轮子?
1 回答
我最终以这种方式解决了这个问题:
我创建了一个自定义的@RepositoryRestController
我创建了我的方法
我从客户端获取枚举,就像String一样,然后我将其转换 . 通过这种方式,客户端也可以发送枚举的翻译字符串
这段代码:
你必须以这种方式注入enumTranslation:
不确定是最好的方法,但用小代码解决了我的问题 .