স্প্রিং ডেটা REST এ একটি @OneToMany সাব-রিসোর্স অ্যাসোসিয়েশন পোস্ট করা


103

স্প্রিং ডেটা রিস্ট ব্যবহার করে বর্তমানে আমার কাছে একটি স্প্রিং বুট অ্যাপ্লিকেশন রয়েছে। আমার একটি ডোমেন সত্তা রয়েছে Postযার @OneToManyঅন্য ডোমেন সত্তার সাথে সম্পর্ক রয়েছে Comment। এই শ্রেণিগুলি নিম্নরূপে কাঠামোযুক্ত:

Post.java:

@Entity
public class Post {

    @Id
    @GeneratedValue
    private long id;
    private String author;
    private String content;
    private String title;

    @OneToMany
    private List<Comment> comments;

    // Standard getters and setters...
}

Comment.java:

@Entity
public class Comment {

    @Id
    @GeneratedValue
    private long id;
    private String author;
    private String content;

    @ManyToOne
    private Post post;

    // Standard getters and setters...
}

তাদের স্প্রিং ডেটা আরএসটি জেপিএ সংগ্রহস্থলগুলির বুনিয়াদি বাস্তবায়ন CrudRepository:

PostRepository.java:

public interface PostRepository extends CrudRepository<Post, Long> { }

CommentRepository.java:

public interface CommentRepository extends CrudRepository<Comment, Long> { }

অ্যাপ্লিকেশন এন্ট্রি পয়েন্টটি একটি মানক, সহজ স্প্রিং বুট অ্যাপ্লিকেশন। সবকিছু স্টক কনফিগার করা আছে।

Application.java

@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {

    public static void main(final String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

সবকিছু সঠিকভাবে কাজ করে বলে মনে হচ্ছে। আমি যখন অ্যাপ্লিকেশনটি চালিত করি তখন সমস্ত কিছুই সঠিকভাবে কাজ করে বলে মনে হয়। আমি পছন্দ করতে একটি নতুন পোস্ট অবজেক্ট পোস্ট করতে http://localhost:8080/postsপারি:

শারীরিক: {"author":"testAuthor", "title":"test", "content":"hello world"}

ফলাফল এখানে http://localhost:8080/posts/1:

{
    "author": "testAuthor",
    "content": "hello world",
    "title": "test",
    "_links": {
        "self": {
            "href": "http://localhost:8080/posts/1"
        },
        "comments": {
            "href": "http://localhost:8080/posts/1/comments"
        }
    }
}

যাইহোক, আমি যখন কোনও জিইটি সঞ্চালন করি তখন আমি http://localhost:8080/posts/1/commentsএকটি খালি বস্তু {}ফিরে পাই এবং আমি যদি একই ইউআরআই-তে কোনও মন্তব্য পোস্ট করার চেষ্টা করি তবে আমি একটি HTTP 405 পদ্ধতি অনুমোদিত নয় get

একটি Commentউত্স তৈরি এবং এটির সাথে যুক্ত করার সঠিক উপায় কী Post? আমি http://localhost:8080/commentsসম্ভব হলে সরাসরি পোস্টিং এড়াতে চাই ।


9
7 দিন পরে এবং এখনও ভাগ্য হয় না। যদি কেউ এই আচরণটি কাজ করার কোনও উপায় জানেন তবে দয়া করে আমাকে জানান। ধন্যবাদ!
ccampo

আপনি কি @ রিপোসিটরিআরস্ট্রোসর বা একটি নিয়ামক ব্যবহার করছেন? এটি পাশাপাশি কোডটি দেখতে সহায়ক হবে।
ম্যাগনাস লাসি

আমি স্প্রিং বুট ডেটা বিশ্রাম ব্যবহার করছি, এটি আমার জন্য কাজ করেছে http://stackoverflow.com/questions/37902946/add-item-to-the-collection-with-foreign-key-via-rest-call
তাইমুর

উত্তর:


47

আপনাকে প্রথমে মন্তব্য পোস্ট করতে হবে এবং মন্তব্য পোস্ট করার সময় আপনি একটি সমিতি পোস্ট সত্তা তৈরি করতে পারেন।

এটি নীচের মত কিছু দেখতে হবে:

http://{server:port}/comment METHOD:POST

{"author":"abc","content":"PQROHSFHFSHOFSHOSF", "post":"http://{server:port}/post/1"}

এবং এটি পুরোপুরি সূক্ষ্ম কাজ করবে।


2
এটি আমার পক্ষে কাজ করেছে। কেবল নিশ্চিত হয়ে নিন author.postযে লিখনযোগ্য (উদাহরণস্বরূপ একটি সেটার বা @JsonValueটিকা দিয়ে)
স্কিফিল্ড

1
এই মন্তব্যটি একটি পোস্ট থেকে অন্য পোস্টে স্থানান্তরিত হিসাবে প্যাচ অনুরোধ সঙ্গে কাজ করা উচিত?
অ্যাকানাদাল

2
এটি আমার (ব্যাপকভাবে) পছন্দসই পদ্ধতির হবে তবে এটি আমার পক্ষে কাজ করে বলে মনে হয় না। :( এটি মন্তব্য তৈরি করে তবে রেজুলেশন টেবিলের মধ্যে সারি তৈরি করে না (POST_COMMENTS) কীভাবে সমাধান করবেন সে সম্পর্কে কোনও পরামর্শ?
ব্যানসেই ২

3
কোনও দৃশ্যের জন্য কী কী উপায় হবে, যেমন ভেন্যু এবং ঠিকানা সত্তার সাথে, যেখানে কোনও ভেন্যুটির একটি ঠিকানা এবং ঠিকানা থাকতে হবে তা ভেন্যুর সাথে যুক্ত থাকতে হবে? মানে ... অনাথ ঠিকানা তৈরি করা এড়াতে যা কখনও কোনও কিছুর জন্য বরাদ্দ করা যায় না? হতে পারে আমি ভুল, কিন্তু ক্লায়েন্ট অ্যাপ্লিকেশন ডেটাবেসের মধ্যে ধারাবাহিকতা বজায় রাখার জন্য কখনও দায়বদ্ধ হওয়া উচিত নয়। আমি কোনও ক্লায়েন্ট অ্যাপ্লিকেশন কোনও ঠিকানা তৈরি করে এবং তারপরে অবশ্যই কোনও ভেন্যুতে নির্ধারিত উপর নির্ভর করতে পারি না। প্রকৃত উত্স তৈরির সাথে উপ-সংস্থান (এই ক্ষেত্রে ঠিকানা সত্তা) পোষ্ট করার কোনও উপায় আছে যাতে আমি অসঙ্গতি এড়াতে পারি ??
এস্ট্রোপোডোটিডিল্ডে

2
আমি এটি করার চেষ্টা করি ( এখানে দেখুন ) তবে কোনও কারণে কেবল সংস্থান নয়, উত্স তৈরি করা হয়েছে।
displayname

55

ধরে নিই যে আপনি ইতিমধ্যে ইউআরআই পোস্টটি আবিষ্কার করেছেন এবং এমনিভাবে অ্যাসোসিয়েশন রিসোর্সের ইউআরআই ( $association_uriনিম্নলিখিত হিসাবে বিবেচিত ), এটি সাধারণত এই পদক্ষেপগুলি নেয়:

  1. সংগ্রহগুলি রিসোর্সগুলি পরিচালনা করে মন্তব্যগুলি আবিষ্কার করুন:

    curl -X GET http://localhost:8080
    
    200 OK
    { _links : {
        comments : { href : "…" },
        posts :  { href : "…" }
      }
    }
    
  2. সংস্থার commentsলিঙ্ক এবং POSTআপনার ডেটা অনুসরণ করুন :

    curl -X POST -H "Content-Type: application/json" $url 
    {  // your payload // … }
    
    201 Created
    Location: $comment_url
    
  3. PUTসমিতি ইউআরআই-কে জারি করে পোস্টটিতে মন্তব্য বরাদ্দ করুন ।

    curl -X PUT -H "Content-Type: text/uri-list" $association_url
    $comment_url
    
    204 No Content
    

দ্রষ্টব্য, শেষ ধাপে, এর স্পেসিফিকেশন অনুযায়ী text/uri-list, আপনি একবারে একাধিক মন্তব্য বরাদ্দের জন্য লাইন ব্রেক দ্বারা পৃথক পৃথক মন্তব্যগুলি সনাক্ত করে একাধিক ইউআরআই জমা দিতে পারেন।

সাধারণ নকশার সিদ্ধান্ত সম্পর্কে আরও কয়েকটি নোট। একটি পোস্ট / মন্তব্য উদাহরণ সাধারণত একটি সমষ্টিগত, যার মানে আমি থেকে ব্যাক-রেফারেন্স এড়িয়ে চলেন এমন একটি বড় উদাহরণ Commentথেকে Postএবং এড়ানোর CommentRepositoryসম্পূর্ণরূপে। মন্তব্যে যদি নিজের মতো করে একটি জীবনচক্র না থাকে (যা তারা সাধারণত কোনও রচনা-শৈলীর সম্পর্কের মধ্যে থাকে না) তবে আপনি মন্তব্যগুলি সরাসরি ইনলাইন রেন্ডার করুন এবং মন্তব্যগুলি যুক্ত করার এবং অপসারণের সম্পূর্ণ প্রক্রিয়াটি বরং ব্যবহার করে মোকাবেলা করা যেতে পারে তাদেরকে JSON প্যাচ । আসন্ন সংস্করণ ২.২ এর সর্বশেষ প্রকাশের প্রার্থীতে স্প্রিং ডেটা আরইএসটি তার জন্য সমর্থন যোগ করেছে ।


4
নীচে ভোটারদের কাছ থেকে এখানে আগ্রহী, ভোটের কারণ কী ছিল;)।
অলিভার ড্রটবহম

3
আমি নিচে ভোটারদের সম্পর্কে নিশ্চিত নই ... এটি করার খ্যাতিও আমার নেই! পোস্টগুলির সাথে মন্তব্যগুলি ইনলাইন রাখার জন্য আমি অগত্যা পছন্দ করি না কারণ হ'ল যখন কোনও একক পোস্টের জন্য আমার হাজার হাজার মন্তব্য থাকে তখন (অসম্ভব) দৃশ্যের বিষয়টি বিবেচনা করুন। আমি প্রতিবার পোস্টের সামগ্রীতে অ্যাক্সেস করতে চাইলে সেগুলির পুরো গুচ্ছটি না পেয়ে মন্তব্যগুলির সংগ্রহটি পৃষ্ঠায়িত করতে সক্ষম হতে চাই।
ccampo

25
আমার কাছে মন্তব্য পোস্ট করার সর্বাধিক স্বজ্ঞাত উপায় হ'ল লোকালহোস্টে পোষ্ট করা : 8080 / পোস্ট / 1 / মন্তব্য । এটি করার সহজ এবং সার্থক উপায় কি নয়? এবং একই সময়ে, আপনার এখনও একটি উত্সর্গীকৃত মন্তব্য সংগ্রহস্থল রাখতে সক্ষম হওয়া উচিত। এটি কি বসন্ত বা এইচএল স্ট্যান্ডার্ড যা এটির অনুমতি দেয় না?
আইসনাদাল

4
@ অলিভারজিয়ারকে কী এখনও এটি করার জন্য প্রস্তাবিত / একমাত্র উপায়? বাচ্চা যদি ননীয় ( @JoinColumn(nullable=false)) হয় না তবে কী হবে ? প্রথমে সন্তানের পোষ্ট করা সম্ভব হবে না, তারপরে পিতামাতার সাথে পুট / প্যাচ করুন।
জেডাব্লু লিম

2
বসন্তের ডাটা বিশ্রামের সাথে তৈরি এপিআই ব্যবহারের জন্য কোনও গাইড নেই? আমি এটি 2 ঘন্টা গগল করেছি এবং কিছুই পাইনি। ধন্যবাদ!
স্কিভ

2

ম্যাপিং অ্যাসোসিয়েশন এবং কম্পোজিশনের 2 প্রকার রয়েছে। সংস্থার ক্ষেত্রে আমরা টেবিল ধারণার মতো জয়েন করতাম

কর্মচারী - 1 থেকে n-> বিভাগ

সুতরাং সমিতি কর্মচারী, বিভাগ, কর্মচারী_পরিষ্কার ক্ষেত্রে 3 টি সারণী তৈরি করা হবে

আপনার কোডটিতে আপনাকে কেবল নিয়োগকর্মী তৈরি করতে হবে। এ ছাড়া ম্যাপিং এর মতো হওয়া উচিত:

class EmployeeEntity{

@OnetoMany(CascadeType.ALL)
   private List<Department> depts {

   }

}

ডিপোমেন্টমেন্ট সত্তায় কোনও ফরেন কী কী ম্যাপিং থাকবে না ... সুতরাং এখন আপনি যখন একক জেসন অনুরোধে বিভাগের সাথে কর্মচারী যুক্ত করার জন্য পোষ্ট অনুরোধটি চেষ্টা করবেন তখন তা যুক্ত করা হবে ....


1

আমি একই দৃশ্যের মুখোমুখি হয়েছিলাম এবং উপ-সত্তার জন্য আমাকে সংগ্রহস্থল শ্রেণিটি সরিয়ে ফেলতে হয়েছিল কারণ আমি একাধিক ম্যাপিং ব্যবহার করেছি এবং মূল সত্তা থেকে ডেটা টানছি। এখন আমি ডেটা সহ পুরো প্রতিক্রিয়া পাচ্ছি।


1
আপনি যে বিষয়টি সম্পর্কে কথা বলবেন তা সহজেই অনুমানের সাথে সম্পন্ন হতে পারে
kboom

0

ওয়ান টোমনি ম্যাপিংয়ের জন্য, আপনি যে শ্রেণীর মানচিত্র করতে চান তার জন্য কেবল একটি পোজো তৈরি করুন এবং @OneToMany এনেটেশন করুন এবং অভ্যন্তরীণভাবে এটি সেই টেবিল আইডিতে মানচিত্র তৈরি করবে will

এছাড়াও, আপনি যে শ্রেণীর ডেটা উদ্ধার করছেন সেটিতে সিরিয়ালাইজযোগ্য ইন্টারফেস প্রয়োগ করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.