小编Oli*_*ohm的帖子

REST API设计:链接资源

假设我有两个顶级资源FooBar.现在Foo需要联系到一些Bar.在Java类中,这看起来像这样:

public class Foo {

  Set<Bar> bars;
}

public class Bar { … }
Run Code Online (Sandbox Code Playgroud)

我想将XML表示形式化为Foo这样的东西:

GET /foos/1

<foo>
  …
  <atom:link rel="self" href="/foos/1" />
  <atom:link rel="bars" href="/foos/1/bars" />
</foo>
Run Code Online (Sandbox Code Playgroud)

所以我几乎将所有Bar 分配给一个Foo嵌套资源.这意味着Bar资源具有单独的生命周期(聚合而不是组合).然后,嵌套资源可能会公开所有链接的内容Bar,如下所示:

GET /foos/1/bars

<bars>
  <atom:link rel="bar" href="/foos/1/bars/1" />
  <atom:link rel="bar" href="/foos/1/bars/2" />
</bars>
Run Code Online (Sandbox Code Playgroud)

另外,我可以<foo>预先在元素中内联集合.然而,我仍然坚持一些问题:虽然这允许我通过触发请求来很好地删除a Bar,但是如何将a分配给a 呢?假设客户端将访问获取:FooDELETE/foos/1/bars/1BarFoo/bars

GET /bars

<bars>
  <bar>
    …
    <atom:link rel="self" href="/bars/4711" …
Run Code Online (Sandbox Code Playgroud)

api rest web-services

7
推荐指数
1
解决办法
4089
查看次数

缺少类org.springframework.objenesis.ObjenesisStd

我正在尝试将Spring Data用于MongoDB.我正在使用MongoDB的全文搜索功能,并希望为文本索引字段(@TextIndexed)尝试Spring Data注释.此功能在Spring Data MongoDB的1.6.0.BUILD-SNAPSHOT中可用.

我试图在Spring中设置简单的应用程序上下文并运行简单的JUnit测试.但是我的应用程序上下文加载失败,因为我将1.5.1.RELEASE更改为1.6.0.BUILD-SNAPSHOT.

我得到的错误如下:

Caused by: org.springframework.beans.BeanInstantiationException: Could
  not instantiate bean class
  [org.springframework.data.mongodb.core.MongoTemplate]: Constructor
  threw exception; nested exception is java.lang.NoClassDefFoundError:
  org/springframework/objenesis/ObjenesisStd at
  org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163) at
  org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:121) at
  org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:280)
    ... 51 more Caused by: java.lang.NoClassDefFoundError:
  org/springframework/objenesis/ObjenesisStd at
  org.springframework.data.mongodb.core.convert.DefaultDbRefResolver.<init>(DefaultDbRefResolver.java:72) at
  org.springframework.data.mongodb.core.MongoTemplate.getDefaultMongoConverter(MongoTemplate.java:1961) at
  org.springframework.data.mongodb.core.MongoTemplate.<init>(MongoTemplate.java:210) at
  org.springframework.data.mongodb.core.MongoTemplate.<init>(MongoTemplate.java:174) at 
  sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at
  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at
  sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at 
  java.lang.reflect.Constructor.newInstance(Constructor.java:513) at
  org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 53 more Caused by: java.lang.ClassNotFoundException:
  org.springframework.objenesis.ObjenesisStd at
  java.net.URLClassLoader$1.run(URLClassLoader.java:202) at
  java.security.AccessController.doPrivileged(Native Method) at
  java.net.URLClassLoader.findClass(URLClassLoader.java:190) at
  java.lang.ClassLoader.loadClass(ClassLoader.java:306) at
  sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at
  java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Run Code Online (Sandbox Code Playgroud)

现在,我试图org.springframework.objenesis.ObjenesisStd …

spring spring-data-mongodb objenesis

7
推荐指数
1
解决办法
8192
查看次数

如何在Spring Data MongoDB存储库的查询方法中使用投影类型?

我一直在使用Spring Data和MongoDB,并且有一个关于限制某些查询的数据量的问题.我已经看到在其中添加自定义查询MongoRepository,但是我没有看到任何限制数据量和返回基本上是较大类的子集的类的示例.

例如,我有一个User具有多个字段的类,但我还想创建一个具有UserShort该类字段子集的User类.例如UserShort,只包含idfirstName/ lastName/ email字段,而不是一切.

我已经看到我可以指定/限制返回的字段,但是我可以让那些返回到不同的类吗?此刻UserShort将返回null,除非我指定的User类,而不是,但字段将被限制到我指定的人.不确定这是否可行?我意识到User下面的课程不是很大,但这是我追求的概念.

用户界面:

public interface Users {}
Run Code Online (Sandbox Code Playgroud)

子集类:

public class UserShort implements Users {

    @Id
    private String id;

    private String firstName;
    private String lastName;

    @Indexed(unique = true)
    private String email;

    //getters / setters
}
Run Code Online (Sandbox Code Playgroud)

全班:

@Document
public class User implements Users {

    @Id
    private String id;

    private String firstName;
    private String lastName; …
Run Code Online (Sandbox Code Playgroud)

java spring mongodb spring-data-mongodb

7
推荐指数
1
解决办法
4598
查看次数

如何使用Spring Data REST存储库创建和连接相关资源?

我有一个使用Spring Data REST/RestRepository架构的简单概念验证演示.我的两个实体是:

@Entity
@org.hibernate.annotations.Proxy(lazy=false)
@Table(name="Address")
public class Address implements Serializable {

    public Address() {}

    @Column(name="ID", nullable=false, unique=true) 
    @Id 
    @GeneratedValue(generator="CUSTOMER_ADDRESSES_ADDRESS_ID_GENERATOR")    
    @org.hibernate.annotations.GenericGenerator(name="CUSTOMER_ADDRESSES_ADDRESS_ID_GENERATOR", strategy="native")  
    private int ID;

    @RestResource(exported = false)
    @ManyToOne(targetEntity=domain.location.CityStateZip.class, fetch=FetchType.LAZY)   
    @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.PERSIST}) 
    @JoinColumns({ @JoinColumn(name="CityStateZipID", referencedColumnName="ID", nullable=false) }) 
    private domain.location.CityStateZip cityStateZip;

    @Column(name="StreetNo", nullable=true) 
    private int streetNo;

    @Column(name="StreetName", nullable=false, length=40)   
    private String streetName;

    <setters and getters ommitted>  
}
Run Code Online (Sandbox Code Playgroud)

并为CityStateZip:

@Entity
public class CityStateZip {

    public CityStateZip() {}

    @Column(name="ID", nullable=false, unique=true) 
    @Id 
    @GeneratedValue(generator="CUSTOMER_ADDRESSES_CITYSTATEZIP_ID_GENERATOR")   
    @org.hibernate.annotations.GenericGenerator(name="CUSTOMER_ADDRESSES_CITYSTATEZIP_ID_GENERATOR", strategy="native") 
    private int ID;

    @Column(name="ZipCode", nullable=false, length=10)  
    private …
Run Code Online (Sandbox Code Playgroud)

java rest spring json spring-data-rest

7
推荐指数
1
解决办法
1722
查看次数

为什么我得到"在实体类上找不到属性节点...将构造函数参数绑定到!" 使用Spring Data MongoDB

试着在LocalDateSpring Data MongoDB和Spring 4中使用JodaTime ,但是我得到以下异常:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mapping.model.MappingException: No property node found on entity class com.th.model.Price to bind constructor parameter to!] with root cause
org.springframework.data.mapping.model.MappingException: No property node found on entity class com.th.model.Price to bind constructor parameter to!
    at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:74)
    at org.springframework.data.mapping.model.SpELExpressionParameterValueProvider.getParameterValue(SpELExpressionParameterValueProvider.java:63)
    at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:71)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:249)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:230)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:190)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:186)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:77)
    at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:2121)
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1805)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1628)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1611) …
Run Code Online (Sandbox Code Playgroud)

spring spring-data spring-data-mongodb

7
推荐指数
1
解决办法
9802
查看次数

如何在Spring Data REST/Spring HATEOAS(微)服务之间建立关系?

在使用基于Spring Data Rest或HATEOAS的基于超媒体的微服务时,试图找出如何处理关系的模式.

如果您有服务A(讲师)和服务B(课程),则每个都作为独立应用程序存在.

建立两种服务之间关系的首选方法是什么.以不需要外部服务的ID列的方式.每个服务都有可能拥有许多需要在同一庄园中进行通信的其他服务.

可能的解决方案(不确定正确的路径)

每个服务都有一个第二个表,其中OneToMany与服务中的主要实体相对应.该表将包含以下字段:

ID,entityID,rel,relatedID

然后在使用Spring Data Rest设置的相反服务中查找查询连接表以查找匹配的记录.

我想要实现的主要目标是任何服务都可以与任何数量的其他服务建立关系,而无需了解其他服务.

hateoas spring-data-rest microservices spring-cloud

7
推荐指数
1
解决办法
3100
查看次数

使用Spring Data REST,为什么@Version属性成为ETag并且不包含在表示中?

在Spring Data REST(通过Spring Boot 1.3.3)中,当我GET是资源集合时people,该@Version属性不包含在资源中:

$curl -v http://localhost:8080/api/people/1
*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /api/people/1 HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.42.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< ETag: "0"
< Last-Modified: Tue, 26 Apr 2016 00:08:12 GMT
< Content-Type: application/hal+json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Tue, 26 Apr 2016 00:12:56 GMT
< 
{
  "id" : 1,
  "createdDate" : {
    "nano" …
Run Code Online (Sandbox Code Playgroud)

rest spring spring-data spring-data-rest spring-boot

7
推荐指数
1
解决办法
3242
查看次数

JPA查询连接表

我有3个表,如:

A                              AB                        B
-------------                  ------------              ---------------
a1                              a1,b1                    b1
Run Code Online (Sandbox Code Playgroud)

AB是A和B之间的转换表

有了这个,我的类在这两个类中没有相互组合.但我想知道,使用JPQL查询,如果我的元素存在于AB表中的A表中的任何记录.只需数字或布尔值就是我需要的.

因为AB是一个转换表,所以没有模型对象,我想知道我是否可以使用我的Repository对象中的@Query来完成此操作.

jpa jpql

6
推荐指数
2
解决办法
2万
查看次数

组合弹簧数据规范的查询在同一个表上有多个连接

对不起,如果我的术语不正确.

我们使用spring数据,JpaRepositories和条件查询作为查询数据库数据的方法.

我有一个问题,当我在下面的代码示例中结合两个规范,例如我在hasCityAndTimeZone中使用hasTimeZone和hasCity时,它会在同一个表上连接两次,所以下面的查询看起来像

select * from Staff, Location, Location
Run Code Online (Sandbox Code Playgroud)

有没有办法让这两个规范使用相同的连接而不是每个定义它们自己的连接基本相同?

对不起代码可能不完整我只是想展示一个简单的例子.

class Staff {
    private Integer id;
    private Location location;
}

class Location {
    private Integer id; 
    private Integer timeZone;
    private Integer city;
}

class StaffSpecs {
    public static Specification<Staff> hasTimeZone(Integer timeZone) {
        return new Specification<Staff>() {
            @Override
            public Predicate toPredicate(Root<Staff> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                Path<Integer> timeZonePath = root.join(Staff_.location).get(Location_.timeZone);
                return cb.equal(timeZonePath, timeZone);
            }
        }
    }

    public static Specification<Staff> hasCity(Integer city) {
        return new Specification<Staff>() {
            @Override
            public Predicate …
Run Code Online (Sandbox Code Playgroud)

spring jpa spring-data spring-data-jpa

6
推荐指数
1
解决办法
1万
查看次数

如何从Spring Data REST生成的表示中删除超媒体元素?

将Spring Data用于我的REST API时,当前返回的响应包括以下_links字段:

{
  "_embedded": {
  "users": [
    {
      "imageUrl": "some_image_url",
      "name": "some name",
      "id": "57420b2a0d31bb6cef4ee8e9",
      "_links": {
        "self": {
          "href": "http://localhost:8080/users/57420b2a0d31bb6cef4ee8e9"
        },
        "user": {
          "href": "http://localhost:8080/users/57420b2a0d31bb6cef4ee8e9{?projection}",
          "templated": true
        }
      }
    },
...
Run Code Online (Sandbox Code Playgroud)

有没有办法产生输出,这样该_links字段是隐藏的?例如:

{
  "_embedded": {
  "users": [
    {
      "imageUrl": "some_image_url",
      "name": "some name",
      "id": "57420b2a0d31bb6cef4ee8e9",
    },
...
Run Code Online (Sandbox Code Playgroud)

我发现因为我暴露了这个id领域,_links并不是真的有必要,而且大多只是混乱我的反应.

rest spring spring-data spring-data-rest spring-boot

6
推荐指数
1
解决办法
124
查看次数