java - فشل اختبار التكامل spring-data-rest مع طلب json بسيط




spring-boot integration-testing (4)

أعتقد أنك بحاجة إلى القيام بشيئين للحصول على هذا العمل.

  1. التعامل مع إلغاء التسلسل بشكل صحيح. كما تتوقعون أن يقوم جاكسون بتعبئة كائن الشخص المتداخل عن طريق المنشئ ، يجب عليك إضافة تعليق عليه باستخدام @JsonCreator . انظر هنا:

http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html

واحدة من الميزات الأكثر قوة في جاكسون هي قدرته على استخدام التعسفي> الصانعين لإنشاء حالات POJO ، من خلال الإشارة إلى المنشئ لاستخدامه مع تعليق @JsonCreator ..................... ...................... عادةً ما يستخدم منشئو المحتوى خاصية لتمرير واحد أو أكثر من المعلمات الإلزامية إلى منشئ (إما مباشرة أو عبر طريقة المصنع). إذا لم يتم العثور على خاصية من JSON ، يتم تمرير null بدلاً من ذلك (أو ، في حالة primitives ، ما يسمى القيمة الافتراضية ؛ 0 لـ ints وما إلى ذلك).

انظر هنا أيضًا عن سبب عدم قدرة جاكسون على العمل بشكل تلقائي.

https://stackoverflow.com/a/22013603/1356423

  1. قم بتحديث مخططات JPA الخاصة بك. إذا كان الشخص المرتبط الآن مأخوذًا بشكل صحيح من قبل جاكسون deserializer ثم بإضافة خيارات شلال JPA اللازمة للعلاقة ، فيجب الاستمرار في كلتا الحالتين.

أعتقد أن ما يلي يجب أن يعمل كما هو متوقع:

public class Order {

    @Id 
    @GeneratedValue(...)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY, cascade = cascadeType.ALL)
    private Person creator;

    private String type;

    @JsonCreator
    public Order(@JsonProperty("creator") Person creator) {
        this.creator = creator;
    }
}

فشل اختبار تكامل spring-data-rest في طلب json بسيط. النظر في نماذج أدناه Jpa

Order.java

public class Order {

    @Id @GeneratedValue//
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)//
    private Person creator;
    private String type;

    public Order(Person creator) {
        this.creator = creator;
    }

    // getters and setters
}

Person.java

ic class Person {

    @Id @GeneratedValue private Long id;

    @Description("A person's first name") //
    private String firstName;

    @Description("A person's last name") //
    private String lastName;

    @Description("A person's siblings") //
    @ManyToMany //
    private List<Person> siblings = new ArrayList<Person>();

    @ManyToOne //
    private Person father;

    @Description("Timestamp this person object was created") //
    private Date created;

    @JsonIgnore //
    private int age;

    private int height, weight;
    private Gender gender;

    // ... getters and setters
}

في الاختبار الذي أجريته ، قمت بإنشاء شخص باستخدام شخصأمرأرتب وحثت من قبل شخص يمر

Person creator = new Person();
creator.setFirstName("Joe");
creator.setLastName("Keith");
created.setCreated(new Date());
created.setAge("30");
creator = personRepository.save(creator);

Order order = new Order(creator);
String orderJson = new ObjectMapper().writeValueAsString(order);

mockMvc.perform(post("/orders").content(orderJson).andDoPrint());

يتم إنشاء الطلب ولكن لا يرتبط هذا المنشئ بالترتيب. وأريد أيضًا تمرير نص الطلب ككائن سلمان. في هذا الكائن json يجب أن يحتوي على المنشئ على النحو التالي

{
"type": "1",
"creator": {
    "id": 1,
    "firstName": "Joe",
    "lastName": "Keith",
    "age": 30
}
}

إذا أرسلت هيئة الطلب مع json التالية ، تعمل المكالمة بشكل جيد

{
"type": "1",
"creator": "http://localhost/people/1"
}

لكنني لا اريد ارسال json الثاني. أي فكرة عن كيفية حل المشكلة. لأن عميلي بالفعل يستهلك استجابة الخادم عن طريق إرسال json الأول. الآن قمت بتحويل الخادم الخاص بي لاستخدام بيانات spring-rest. بعد أن كل رمز العميل الخاص بي لا يعمل.

كيفية حل هذا؟


أنت تربط بشكل صحيح الطلب مع منشئ المحتوى ، ومع ذلك لا يرتبط الشخص بالأوامر. أنت تفتقد حقل List<Order> orders في فصيلة الشخص. أضف هذا ، وأضف تعليقًا توضيحيًا ، وأضف أساليب لإضافة الأمر إلى الشخص ، ثم قبل إرسال JSON ، يجب عليك الاتصال بشيء كالتالي:

creator.addOrder(order);
order.setCreator(cretr);

هناك بعض الطرق لحل مشكلتك ، ولكن أريد أن أقدم لك تلميحًا. يمكنك فقط حفظ "id" الشخص الخاص بك والحصول على الشخص عن طريق "id" من قاعدة البيانات الخاصة بك ، عندما تحتاج هذا.

يحل مشكلتك ويحفظ أيضا الذاكرة.


يجب أن تقوم فئتي " Order و Person بتنفيذ Serializable بشكل صحيح في JSON وإعادة JSON .





spring-data-rest