2016-11-17 9 views
3

Мой первый эксперимент с Spring Data Rest не работает. Я взял «Начало работы» и немного изменил его, чтобы создать два объекта, которые имеют отношения «один-к-одному». Объекты: Book и Shelve, и многие книги могут делиться полкой.404 при установке ресурса ассоциации

Shelve объект выглядит следующим образом:

package hello; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

@Entity 
public class Shelve 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    private int length; 

    public int getLength() { 
     return length; 
    } 

    public void setLength(int length) { 
     this.length = length; 
    } 
} 

Book относится к нему:

package hello; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.ManyToOne; 

@Entity 
public class Book 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    private String title; 

    @ManyToOne 
    private Shelve shelve; 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public Shelve getShelve() { 
     return shelve; 
    } 

    public void setShelve(Shelve shelve) { 
     this.shelve = shelve; 
    } 
} 

Полный проект доступен here in GitHub.

Теперь я могу добавить Полочка:

curl -i -X POST -H "Content-Type:application/json" -d "{ \"length\" : \"30\" }" http://localhost:8080/shelves 
HTTP/1.1 201 
Location: http://localhost:8080/shelves/1 
Content-Type: application/hal+json;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Thu, 17 Nov 2016 16:05:02 GMT 

{ 
    "length" : 30, 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8080/shelves/1" 
    }, 
    "shelve" : { 
     "href" : "http://localhost:8080/shelves/1" 
    } 
    } 
} 

Затем книгу:

curl -i -X POST -H "Content-Type:application/json" -d "{ \"title\" : \"The Battle of Life\" }" http://localhost:8080/books 
HTTP/1.1 201 
Location: http://localhost:8080/books/1 
Content-Type: application/hal+json;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Thu, 17 Nov 2016 16:05:02 GMT 

{ 
    "title" : "The Battle of Life", 
    "_links" : { 
    "self" : { 
     "href" : "http://localhost:8080/books/1" 
    }, 
    "book" : { 
     "href" : "http://localhost:8080/books/1" 
    }, 
    "shelve" : { 
     "href" : "http://localhost:8080/books/1/shelve" 
    } 
    } 
} 

Тогда я пытаюсь поставить книгу на полку, но это не удается:

curl -i -X PUT -H "ContentType: text/uri-list" -d "http://localhost:8080/shelves/1" http://localhost:8080/books/1/shelve 
HTTP/1.1 404 
Content-Type: application/json;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Thu, 17 Nov 2016 16:05:02 GMT 

{"timestamp":1479398702523,"status":404,"error":"Not Found","message":"No message available","path":"/books/1/shelve"} 

Любая идея, что здесь происходит не так?

ответ

0

вероятно вам нужно указать ссылку на стороне «сукно», и попытаться добавить книгу в полку

// Полочка моделируют

@OneToMany(mappedBy = "shelve") 
public Set<Book> getBooks() { 
    return books; 
} 

public void setBooks(Set<Book> books) { 
    this.books = books; 
} 

// локон добавить книгу сукно

curl -i -X PUT -H "ContentType: text/uri-list" -d "http://localhost:8080/books/1" http://localhost:8080/shelve/1/books 
+0

Это может сработать, но это не та модель, которую я хочу. В приведенном выше коде, очевидно, рассматривается только Spring Rest. Мне нужно ManyToOne. – Bert

+0

@ Берт, вы добавили @ onetomany в другую сторону и попробовали дополнение ManyToOne? – kuhajeyan

+0

Нет, я этого не делал, потому что не хочу, чтобы это было в моей модели. Мне нужно одностороннее судоходство. – Bert

1

Как указал Оливер Гирке на the related JIRA ticket, вопрос находится в запросе curl. Он должен иметь hypen в Content-Type:

curl -i -X PUT -H "Content-Type: text/uri-list" -d "http://localhost:8080/shelves/1" http://localhost:8080/books/1/shelve 
HTTP/1.1 204 
Date: Sat, 19 Nov 2016 16:50:24 GMT 

Так что все работает, как и ожидалось, при условии использования это правильный путь :)

@Oliver: Большое спасибо!