Je demande Spring MVC avec les terminaux asynchrones:Comment puis-je transmettre une session http à DeferredResult?
@GetMapping
public DeferredResult<Collection<B>> get() {
DeferredResult<Collection<B>> result = new DeferredResult<>();
Executors.newSingleThreadExecutor().submit(() -> result.setResult(service.getB()));
return result;
}
J'essaie de sérialiser l'objet paresseux avec jackson-datatype-hibernate:
@Entity
@Table
public class B {
@Id
@GeneratedValue
private UUID id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "a_id")
private A a;
public A getA() {
return a;
}
}
Mais je reçois:
Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.example.demo.B["a"])
L'erreur est liée à la 'session Hibernate' et non à la' HTTP Session'; fondamentalement, vous essayez de marhsal aussi la propriété 'A a' de la classe' B' puisque vous avez une stratégie de fetch 'Lazy', vous obtenez l'erreur –
@AngeloImmediata En fait, il fonctionne avec Callable ou CompletableFuture quand je ne cherche pas à exécuter une tâche dans un nouveau thread. J'ai ajouté le bean MappingJackson2HttpMessageConverter avec ObjectMapper personnalisé en utilisant com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module. –
Ceci est étrange .. l'erreur est assez claire et la stratégie de récupération est toujours claire. Avez-vous vérifié que lorsque cela fonctionne tous les paramètres sont les mêmes que ceux du test qui ne fonctionne pas? –