Spring Data REST Controller不接受JSON参数

时间:2017-09-19 19:10:36

标签: java spring jpa spring-data-jpa spring-data-rest

我正在创建一个模拟商店前端的程序。我在输入名称后尝试测试返回供应商名称的搜索功能。我使用swagger UI输入一个返回预期响应的参数。

此处是源代码的链接:https://github.com/opensource-io/training_storefront

我正在使用这个实体。我已经修整了吸气剂和制定者,因为它们并不相关。

@Entity
@Component
@Scope("prototype")
@Table(name="VENDORS", schema = "TRAINING_STOREFRONT")
public class VendorEntity {

@Id
@Column(name="VENDOR_KEY")
@NotNull
private Integer vendorKey;

@Column(name="VENDOR_NAME")
@NotNull
private String vendorName;
. . .

我使用Spring Data REST创建RESTful存储库。这是我的Spring Data REST JPA接口。

@RepositoryRestResource(collectionResourceRel = "vendors", path = "vendors")
public interface VendorRepository extends JpaRepository<VendorEntity, Integer> {

Set<VendorEntity> findByVendorNameContainsIgnoreCase(@Param("vendorName") final String vendorName);

List<VendorEntity> findAllByOrderByVendorKeyAsc();

}

我使用Swagger来记录和测试我的API。当我使用Swagger或curl发送参数时:

{ "vendorName" : "Red Hat" }

卷曲

curl -X GET --header 'Content-Type: application/json' --header 'Accept: application/hal+json' -d 'red hat' 'http://localhost:8080/vendors/search/getVendorByVendorNameContainsIgnoreCase

以下是返回的内容:

{
  "cause": {
    "cause": null,
    "message": "Value must not be null!"
  },
  "message": "Value must not be null!; nested exception is java.lang.IllegalArgumentException: Value must not be null!"
}

这是预期的:

{
  "content": [
    [
      {
        "vendorKey": 0,
        "vendorName": "string"
      }
    ]
  ],
  "links": [
    {
      "href": "string",
      "rel": "string",
      "templated": true
    }
  ]
}

1 个答案:

答案 0 :(得分:1)

正如Alan在评论中指出的那样,在Spring Data REST中调用搜索资源时,您应该直接在URL中提供搜索参数作为GET参数。

文档中没有直接说明,但您可以看到它,例如here

您的REST调用正在返回此错误,因为您尚未提供参数。

正确的CURL调用将形成如下:

curl -X GET --header 'Content-Type: application/json' --header 'Accept: application/hal+json' 'http://localhost:8080/vendors/search/getVendorByVendorNameContainsIgnoreCase?vendorName=red%20hat'

不幸的是,Swagger并没有很好地配合Spring Data REST,所以有时会产生令人困惑的例子。