Java 使用Spring数据REST管理枚举
我有一个关于SpringBoot1.5.7、SpringDataREST、Hibernate、HATEOAS和SpringValidation的项目 我真的很难管理枚举。我需要两件简单的事情:Java 使用Spring数据REST管理枚举,java,spring,spring-mvc,spring-data-rest,spring-rest,Java,Spring,Spring Mvc,Spring Data Rest,Spring Rest,我有一个关于SpringBoot1.5.7、SpringDataREST、Hibernate、HATEOAS和SpringValidation的项目 我真的很难管理枚举。我需要两件简单的事情: 获取特定枚举的项列表(HTTP REST) 将枚举作为参数发送到HTTP REST调用中 我使用的是SpringDataREST,所以应该从中做很多工作 我的枚举是基本的,如: public enum TransitCertificateStatus { PENDING, USED, CANCEL
public enum TransitCertificateStatus {
PENDING, USED, CANCELED, ARCHIVED
}
此枚举用于bean:
@Entity
@EntityListeners(TransitCertificateListener.class)
public class TransitCertificate extends AbstractEntity {
private static final long serialVersionUID = 5978999252424024545L;
@NotNull(message = "{NotNull.transitcertificate.status}")
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private TransitCertificateStatus status = TransitCertificateStatus.PENDING;
要向客户端公开枚举项,我创建了一个自定义控制器:
@Api(tags = "TransitCertificate Entity")
@RepositoryRestController
@RequestMapping(path = "/api/v1/transitCertificates")
public class TransitCertificateController {
private Logger log = LogManager.getLogger();
@RequestMapping(method = RequestMethod.GET, path = "/states", produces = "application/json")
public @ResponseBody ResponseEntity<?> getTransitCertificateStates() {
Resources<TransitCertificateStatus> resources = new Resources<TransitCertificateStatus>(
Arrays.asList(TransitCertificateStatus.values()));
return ResponseEntity.ok(resources);
}
注意,这些项被转换是因为我将这些值设置为rest-messages.properties和Spring数据,rest负责转换
server.model.enums.TransitCertificateStatus.PENDING = In attesa
server.model.enums.TransitCertificateStatus.USED = Utilizzato
server.model.enums.TransitCertificateStatus.CANCELED = Annullato
server.model.enums.TransitCertificateStatus.ARCHIVED = Archiviato
到目前为止,一切都如预期的那样。
现在,我需要获得一个按beanTransitCertificate
筛选的存储库列表,并将存储库作为REST资源直接公开:
@RepositoryRestResource
@Transactional
@PreAuthorize("isAuthenticated()")
public interface TransitCertificateRepository extends PagingAndSortingRepository<TransitCertificate, Long> {
@Transactional(readOnly = true)
@Query("SELECT t FROM TransitCertificate t WHERE (:code IS NULL OR code=:code) AND (:date IS NULL OR DATE(createdDate)=DATE(:date)) AND (:text IS NULL OR text LIKE CONCAT('%',:text,'%')) AND (:from IS NULL OR t.from LIKE CONCAT('%',:from,'%')) AND (:customerName IS NULL OR customerName LIKE CONCAT('%',:customerName,'%')) AND (:states IS NULL OR status IN (:states)) ")
public Page<TransitCertificate> findAllByParameters(@Param("code") @RequestParam(value = "code", required = false) String code,
@Param("date") @RequestParam(value = "date", required = false) Instant date,
@Param("text") @RequestParam(value = "text", required = false) String text,
@Param("from") @RequestParam(value = "from", required = false) String from,
@Param("customerName") @RequestParam(value = "customerName", required = false) String customerName,
@Param("states") @RequestParam(value = "states", required = false) List<TransitCertificateStatus> states, Pageable pageable);
@Transactional(readOnly = true)
@Query("SELECT t FROM TransitCertificate t WHERE (:#{#filter} IS NULL OR t.status=:#{#filter.status}) ")
public Page<TransitCertificate> findAllByParameters2(@RequestBody @RequestParam(value="filter") @Param("filter") TransitCertificateFilter filter,
Pageable pageable);
所以我尝试了另一种方法
第二种方法
这次我创建了一个bean作为过滤器,它包含了查询中应该过滤的所有参数
public class TransitCertificateFilter implements Serializable {
private TransitCertificateStatus status;
public TransitCertificateStatus getStatus() {
return status;
}
public void setStatus(TransitCertificateStatus status) {
this.status = status;
}
}
在方法findAllByParameters2
中,我使用SpEL从客户端发送的bean中获取属性status
请求如下:
{
"status":"Annullato"
}
这是我回来的一个例外:
{
"timestamp": "2017-10-12T15:46:20.292+0000",
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.expression.spel.SpelEvaluationException",
"message": "EL1007E: Property or field 'status' cannot be found on null",
"path": "/api/v1/transitCertificates/search/findAllByParameters2"
}
我搜索了一些关于这个的信息,但没有找到任何有用的。有人能让我走上正确的道路吗
{
"status":"Annullato"
}
{
"timestamp": "2017-10-12T15:46:20.292+0000",
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.expression.spel.SpelEvaluationException",
"message": "EL1007E: Property or field 'status' cannot be found on null",
"path": "/api/v1/transitCertificates/search/findAllByParameters2"
}