PostForEntity test: "Could not write JSON: Infinite recursion (StackOverflowError);" on multi tb - one-to-many

I have spring boot hibernate TestRestTemplate project, and running "mvn test" with it.
I have two database tables: Customer and ShippingAddress:
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
private Integer id;
#Basic(optional = false)
#Column(name = "first_name")
private String firstName;
#Basic(optional = false)
#Column(name = "last_name")
private String lastName;
#Basic(optional = false)
private String phone;
#Basic(optional = false)
#Column(name = "email_address")
private String emailAddress;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
private Collection<Product> productCollection;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
private Collection<PurchaseOrder> purchaseOrderCollection;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
private Collection<Review> reviewCollection;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "customer", orphanRemoval = true)
private List<ShippingAddress> shippingAddressCollection = new ArrayList<>();
And the ShippingAddress table:
public class ShippingAddress implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 100)
#Column(name = "address1")
private String address1;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 100)
#Column(name = "address2")
private String address2;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 30)
#Column(name = "city")
private String city;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 30)
#Column(name = "state")
private String state;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 30)
#Column(name = "postcode")
private String postcode;
#JoinColumn(name = "cust_id", referencedColumnName = "id") // id is the primary key in Customer table
#ManyToOne(optional = false)
private Customer customer;
ShippingAddressControllerRestTemplateTest Controller:
#Test
public void create_shipping_address_and_customer() throws Exception {
Customer newCustomer = new Customer("wendy", "hades", "myname#shipping.com", "04000000");
ShippingAddress shippingAddress1 = new ShippingAddress("unit 1", "89 hanson road", "New York", "CA", "KKKDLDL");
shippingAddress1.setCustomer(newCustomer);
// ShippingAddress shippingAddress2 = new ShippingAddress("", "111 green st", "MA", "CA", "AAAAA");
// shippingAddress2.setCustomer(newCustomer);
ArrayList<ShippingAddress> shippingAddressList = new ArrayList<>();
shippingAddressList.add(shippingAddress1);
// shippingAddressList.add(shippingAddress2);
newCustomer.setShippingAddressCollection(shippingAddressList);
System.out.println("*****CustomerControllerRestTemplateTest***in save_save_OK() **********");
HttpEntity<Customer> requestBody = new HttpEntity<>(newCustomer);
ResponseEntity<String> response = restTemplate.postForEntity("/addcustomer", requestBody, String.class);
assertEquals(HttpStatus.CREATED, response.getStatusCode());
}
Exceptions from running "mvn test":
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.069 s <<< FAILURE! - in dorinca_rest.controller.ShippingAddressControllerRestTemplateTest
[ERROR] create_shippi`enter code here`ng_address_and_customer(dorinca_rest.controller.ShippingAddressControllerRestTemplateTest) Time elapsed: 0.057 s <<< ERROR!
org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON:`enter code here` Infinite recursion (StackOverflowError);
The StackOverflowError error seems to be my two tables are referencing to each other, but it isn't the case after I take a closer look at it. And I am not sure the way I am using restTemplate.PostForEntity() is correct. I basically posting a list / collection for the PostMapping. The Customer table and the ShippingAddress table has only one way referencing, that is one to many relationship.

Related

using csvhelper writer with shouldquote in vb.net

I can see how shouldquote works with c# but does anyone have an example in vb.net?
I need to wrap every field with chr(34)
Private Sub Main()
Dim records = New List(Of Foo) From {
New Foo With {
.Id = 1,
.Name = "one"
}
}
Dim config = New CsvConfiguration(CultureInfo.InvariantCulture) With {
.ShouldQuote = Function(args) True
}
Using csv = New CsvWriter(Console.Out, config)
csv.WriteRecords(records)
End Using
End Sub
Public Class Foo
Public Property Id As Integer
Public Property Name As String
End Class

Infinispan cluster error: MarshallableUserObject marshaller not overridden in SerializationContext

I have a test cluster with 2 embedded nodes (Infinispan 12.1.4.Final). I use a replicated cache with RocksDB cache-store. The cache's size is about 4 GB. And sometimes, when I restart nodes, I get that exception, and one of the nodes freezes - it waits for cache rebalance. The replicated cache's configurated like:
<replicated-cache name="event" statistics="true">
<expiration interval="3600000"/>
<persistence>
<rocksdb-store xmlns="urn:infinispan:config:store:rocksdb:12.1" path="rocksdb/data" fetch-state="true">
<expiration path="rocksdb/expired"/>
</rocksdb-store>
</persistence>
<memory max-count="100"/>
<indexing>
<index-reader refresh-interval="5000"/>
<indexed-entities>
<indexed-entity>org.example.model.IndexedEndpointEventModel</indexed-entity>
</indexed-entities>
</indexing>
</replicated-cache>
A whole stack trace:
2021-06-10 19:41:27,993 ERROR [org.inf.sta.StateProviderImpl] (non-blocking-thread--p2-t1) ISPN000261: Failed to execute outbound transfer: org.infinispan.persistence.spi.PersistenceException: java.lang.IllegalStateException: MarshallableUserObject marshaller not overridden in SerializationContext
at org.infinispan.marshall.persistence.impl.MarshallableEntryImpl.unmarshall(MarshallableEntryImpl.java:248)
at org.infinispan.marshall.persistence.impl.MarshallableEntryImpl.unmarshall(MarshallableEntryImpl.java:237)
at org.infinispan.marshall.persistence.impl.MarshallableEntryImpl.getValue(MarshallableEntryImpl.java:81)
at org.infinispan.statetransfer.StateProviderImpl.defaultMapEntryFromStore(StateProviderImpl.java:379)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableMap$MapSubscriber.onNext(FlowableMap.java:64)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableUsing$UsingSubscriber.onNext(FlowableUsing.java:104)
at io.reactivex.rxjava3.internal.util.HalfSerializer.onNext(HalfSerializer.java:45)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableConcatMap$ConcatMapImmediate.innerNext(FlowableConcatMap.java:204)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableConcatMap$ConcatMapInner.onNext(FlowableConcatMap.java:559)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableObserveOn$ObserveOnSubscriber.runAsync(FlowableObserveOn.java:402)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176)
at io.reactivex.rxjava3.internal.schedulers.ExecutorScheduler$ExecutorWorker$BooleanRunnable.run(ExecutorScheduler.java:322)
at io.reactivex.rxjava3.internal.schedulers.ExecutorScheduler$ExecutorWorker.runEager(ExecutorScheduler.java:287)
at io.reactivex.rxjava3.internal.schedulers.ExecutorScheduler$ExecutorWorker.run(ExecutorScheduler.java:248)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalStateException: MarshallableUserObject marshaller not overridden in SerializationContext
at org.infinispan.marshall.protostream.impl.MarshallableUserObject.<init>(MarshallableUserObject.java:44)
at org.infinispan.marshall.protostream.impl.MarshallableUserObject$___Marshaller_ff6b068168b51aac5d0c18c371e02ff55d3bb0cb73296e9cf1f4a65917105dec.read(MarshallableUserObject$___Marshaller_ff6b068168b51aac5d0c18c371e02ff55d3bb0cb73296e9cf1f4a65917105dec.java:49)
at org.infinispan.marshall.protostream.impl.MarshallableUserObject$___Marshaller_ff6b068168b51aac5d0c18c371e02ff55d3bb0cb73296e9cf1f4a65917105dec.read(MarshallableUserObject$___Marshaller_ff6b068168b51aac5d0c18c371e02ff55d3bb0cb73296e9cf1f4a65917105dec.java:15)
at org.infinispan.protostream.impl.ProtobufTagMarshallerDelegate.unmarshall(ProtobufTagMarshallerDelegate.java:32)
at org.infinispan.protostream.WrappedMessage.readMessage(WrappedMessage.java:539)
at org.infinispan.protostream.WrappedMessage.read(WrappedMessage.java:351)
at org.infinispan.protostream.ProtobufUtil.fromWrappedByteArray(ProtobufUtil.java:129)
at org.infinispan.marshall.protostream.impl.AbstractInternalProtoStreamMarshaller.objectFromByteBuffer(AbstractInternalProtoStreamMarshaller.java:97)
at org.infinispan.marshall.persistence.impl.MarshallableEntryImpl.unmarshall(MarshallableEntryImpl.java:246)
... 16 more
Anybody had the same issue?
Edit1:
Add IndexedEndpointEventModel definition:
#Indexed
public class IndexedEndpointEventModel implements Serializable {
private static final Random RANDOM = new Random();
private String field1;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private LocalDateTime field2;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private LocalDateTime field3;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private String field4;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private String field5;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private String field6;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private String field7;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private String field8;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private String field9;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private String field10;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private String field11;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private Long field12;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private Integer field13;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private String field14;
#GenericField(projectable = Projectable.YES, searchable = Searchable.YES, sortable = Sortable.YES, aggregable = Aggregable.NO)
private Boolean field15;
private String field16;
private Map<String, List<String>> field17;
private Map<String, List<String>> field18;
public IndexedEndpointEventModel() {
field1 = UUID.randomUUID().toString();
field2 = LocalDateTime.now();
field3 = LocalDateTime.now();
field4 = UUID.randomUUID().toString();
field5 = UUID.randomUUID().toString();
field6 = UUID.randomUUID().toString();
field7 = UUID.randomUUID().toString();
field8 = UUID.randomUUID().toString();
field9 = UUID.randomUUID().toString();
field10 = UUID.randomUUID().toString();
field11 = UUID.randomUUID().toString();
field12 = RANDOM.nextLong();
field13 = RANDOM.nextInt();
field14 = UUID.randomUUID().toString();
field15 = RANDOM.nextBoolean();
field16 = UUID.randomUUID().toString();
field17 = Map.of(UUID.randomUUID().toString(), List.of(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
field18 = Map.of(UUID.randomUUID().toString(), List.of(UUID.randomUUID().toString()), UUID.randomUUID().toString(), List.of(UUID.randomUUID().toString()));
}
// Setters/Getters
}
Edit2:
Additional exception stack trace (with await-initial-transfer="false"):
2021-06-11 21:29:57,973 ERROR [org.inf.int.imp.InvocationContextInterceptor] (non-blocking-thread--p2-t12) ISPN000136: Error executing command PutKeyValueCommand on Cache 'event', writing keys [cc05c0d7-b984-485d-8afd-298743550a7b]: java.lang.IllegalStateException: MarshallableUserObject marshaller not overridden in SerializationContext
at org.infinispan.marshall.protostream.impl.MarshallableUserObject.<init>(MarshallableUserObject.java:44)
at org.infinispan.marshall.protostream.impl.MarshallableUserObject$___Marshaller_ff6b068168b51aac5d0c18c371e02ff55d3bb0cb73296e9cf1f4a65917105dec.read(MarshallableUserObject$___Marshaller_ff6b068168b51aac5d0c18c371e02ff55d3bb0cb73296e9cf1f4a65917105dec.java:49)
at org.infinispan.marshall.protostream.impl.MarshallableUserObject$___Marshaller_ff6b068168b51aac5d0c18c371e02ff55d3bb0cb73296e9cf1f4a65917105dec.read(MarshallableUserObject$___Marshaller_ff6b068168b51aac5d0c18c371e02ff55d3bb0cb73296e9cf1f4a65917105dec.java:15)
at org.infinispan.protostream.impl.ProtobufTagMarshallerDelegate.unmarshall(ProtobufTagMarshallerDelegate.java:32)
at org.infinispan.protostream.WrappedMessage.readMessage(WrappedMessage.java:539)
at org.infinispan.protostream.WrappedMessage.read(WrappedMessage.java:351)
at org.infinispan.protostream.ProtobufUtil.fromWrappedByteArray(ProtobufUtil.java:129)
at org.infinispan.marshall.protostream.impl.AbstractInternalProtoStreamMarshaller.objectFromByteBuffer(AbstractInternalProtoStreamMarshaller.java:97)
at org.infinispan.marshall.protostream.impl.AbstractInternalProtoStreamMarshaller.objectFromByteBuffer(AbstractInternalProtoStreamMarshaller.java:92)
at org.infinispan.persistence.rocksdb.RocksDBStore.unmarshall(RocksDBStore.java:524)
at org.infinispan.persistence.rocksdb.RocksDBStore.unmarshall(RocksDBStore.java:531)
at org.infinispan.persistence.rocksdb.RocksDBStore.putExpireDbData(RocksDBStore.java:1106)
at org.infinispan.persistence.rocksdb.RocksDBStore.addNewExpiry(RocksDBStore.java:551)
at org.infinispan.persistence.rocksdb.RocksDBStore.access$1200(RocksDBStore.java:82)
at org.infinispan.persistence.rocksdb.RocksDBStore$RocksDBHandler.lambda$write$2(RocksDBStore.java:753)
at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
at java.base/java.lang.Thread.run(Thread.java:834)

How to I add an item to a list with class in vb?

I have to convert my c# into vb but it didn't convert 100%, I'm stuck on adding items to lists with class objects.
I get error here (Value of type 'Boolean' cannot be converted to '_Default.Courses') on the course list add:
Public Class Courses
Public courseName As String
Public qualName As String
Public providerName As String
End Class
...
While r.Read
Dim coursename As String = r("courseName").ToString
Dim qualname As String = r("qualName").ToString
Dim providername As String = r("providerName").ToString
courseList.Add(New Courses() With {
Key.courseName = coursename,
Key.qualName = qualname,
Key.providerName = providername
})
End While
...
And this is the original c# code:
while (r.Read())
{
string coursename = r["courseName"].ToString();
string qualname = r["qualName"].ToString();
string providername = r["providerName"].ToString();
courseList.Add(new Courses
{
courseName = coursename,
qualName = qualname,
providerName = providername
});
}
Change your code as :
While r.Read
Dim coursename As String = r("courseName").ToString
Dim qualname As String = r("qualName").ToString
Dim providername As String = r("providerName").ToString
courseList.Add(New Courses() With {
.courseName = coursename,
.qualName = qualname,
.providerName = providername
})
End While

Create own data examples in LinqPad

I have a class (vb.net) with some data that I want to query in LinqPad. I already worked with some examples as the one from "Linq in Action" so they work with some kind of classes with data as well to explain queries. But I just cannot find anything about how to import or write your own classes. Could anyone help me here?
My Class looks like:
Public Class Employee
Public Property ID As Integer
Public Property Salery As Integer
Public Property Name As String
Public Property Department As String
Public Property Gender As String
Public Shared Function GetAllEmployees() As List(Of Employee)
Return New List(Of Employee) From { _
New Employee With {.ID = 1, .Name = "Mark", .Department = "HR", .Gender = "Male", .Salery = 12000},
New Employee With {.ID = 2, .Name = "Sandra", .Department = "IT", .Gender = "Female", .Salery = 2000} _
}
End Function
End Class
You might be missing a couple things about using LINQPad:
Set the Language to "VB Program" and put classes where the comment says to.
Use the Dump method to output an expression. (For "VB Expression", Dump is called automatically.)
Here is an example. (Note, you might be using that SQL-looking syntax.)
Sub Main
Employee.GetAllEmployees() _
.Where(Function (employee) employee.Department = "HR") _
.Dump()
Dim hrEmployees = From employee In Employee.GetAllEmployees()
Where employee.Department = "HR"
hrEmployees.Dump()
End Sub
' Define other methods and classes here
Public Class Employee
Public Property ID As Integer
Public Property Salery As Integer
Public Property Name As String
Public Property Department As String
Public Property Gender As String
Public Shared Function GetAllEmployees() As List(Of Employee)
Return New List(Of Employee) From { _
New Employee With {.ID = 1, .Name = "Mark", .Department = "HR", .Gender = "Male", .Salery = 12000},
New Employee With {.ID = 2, .Name = "Sandra", .Department = "IT", .Gender = "Female", .Salery = 2000} _
}
End Function
End Class

Multiple Parameters in LINQ to SQL

I am trying to pass several search parameters to an LINQ expression to retrieve all entries that contain one of the search items.
Example:
Dim query = From p In db.BEW_PROFIL
For Each searchItem As String In searchItems
Dim item As String = searchItem
query = query.Where(Function(p) p.NAME = item)
Next
Problem here is I don´t get any results because the Where clause looks with that code something like this.
... Where p.NAME = item1 AND p.NAME = item2
What i need is an OR between the parameters, but I don´t get it how I can achieve this.
Any help would be greatly appreciated.
Got it...
void Main()
{
var searchItems = new string[] { "test", "past", "most", "last", "fast", "feast", "yeast", "cast" };
var query = from p in searchItems select new MyClass { Name = p };
Predicate<MyClass> whereClause = _ => false;
foreach (var item in searchItems)
{
var searchItem = item;
Predicate<MyClass> oldClause = whereClause;
whereClause = p => p.Name == searchItem || oldClause(p);
}
query = query.Where(p => whereClause(p));
query.Dump();
}
public class MyClass
{
public MyClass() { }
public string Name { get; set; }
}
The code was ran in LINQPad, and that returned every element.
Here is that code translated to Vb.Net
Private Sub Main()
Dim searchItems = New String() {"test", "past", "most", "last", "fast", "feast", "yeast", "cast"}
Dim query = From p In searchItems Select New [MyClass]() With { .Name = p }
Dim whereClause As Predicate(Of [MyClass]) = Function(element) False
For Each item As String In searchItems
Dim searchItem = item
Dim oldClause As Predicate(Of [MyClass]) = whereClause
whereClause = Function(p) p.Name = searchItem OrElse oldClause(p)
Next
query = query.Where(Function(p) whereClause(p))
query.Dump()
End Sub
Public Class [MyClass]
Public Sub New()
End Sub
Public Property Name() As String
Get
Return m_Name
End Get
Set
m_Name = Value
End Set
End Property
Private m_Name As String
End Class