#java #spring-boot #elasticsearch #spring-hateoas #hateoas
#java #пружинный ботинок #эластичный поиск #весна-ненависть к людям #hateoas
Вопрос:
У меня следующая проблема: мне нужно сохранить структуру Hateos в Elasticsearch, используя метод сохранения в приложении Springboot, но я получаю сообщение об ошибке «stackoverflowerror null»: Может ли кто-нибудь проверить мой код, чтобы увидеть, где я допускаю ошибки? Мне действительно потребовалось много времени, чтобы продемонстрировать этот пример.
Config.java
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.example.demo.elsticsearch")
public class Config {
@Bean
public RestHighLevelClient client() {
ClientConfiguration clientConfiguration
= ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
return RestClients.create(clientConfiguration).rest();
}
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchRestTemplate(client());
}
}
UserResourceAssembler.java
@Service
public class UserResourseAssembler extends RepresentationModelAssemblerSupport<User, UserResourse> {
public UserResourseAssembler() {
super(JsController.class, UserResourse.class);
}
@Override
public UserResourse toModel(User user) {
UserResourse resource = UserResourse.builder().email("jjj").firstName("hii").lastName("hoo").loginId("123").build();
resource.add(linkTo(methodOn(JsController.class).getByLoginId(user.getLoginId())).withRel("self"));
return resource;
}
}
Repo.java
@Repository
public interface Repo extends ElasticsearchRepository<UserResourse, String> {
List<UserResourse> findByLoginId(String loginId);
}
User.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String loginId;
private String firstName;
private String lastName;
private String email;
}
UserResourse.java
@Mapping(mappingPath = "/files.json")
@Document(indexName = "files", type = "file")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserResourse extends RepresentationModel<UserResourse> {
@Id
private String loginId;
private String firstName;
private String lastName;
private String email;
}
JsController.java
@RestController
@RequestMapping("/user")
@AllArgsConstructor
public class JsController {
private final Repo repository;
private final UserResourseAssembler userResourseAssembler;
@GetMapping("/check")
public ResponseEntity<UserResourse> uploadData() {
User user = new User(UUID.randomUUID().toString(), "hi", "hello", "jj");
UserResourse userResourse = userResourseAssembler.toModel(user);
repository.save(userResourse);
return new ResponseEntity<>(userResourse, HttpStatus.OK);
}
@GetMapping("/jobId")
public List<UserResourse> getByLoginId(@PathVariable String loginId) {
return repository.findByLoginId(loginId);
}
}
Я получаю следующую ошибку:
2020-09-18 10:02:35.939 ERROR 16184 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.elasticsearch.ElasticsearchException: Cannot render document to JSON] with root cause
java.lang.StackOverflowError: null
at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na]
Комментарии:
1. У меня такая же ошибка
2. Почему вы хотите поместить RepresentationModel (UserResourse) в ElasticSearch? Он добавляет много дополнительных полей, которые предназначены только для hateoas. Почему бы просто не сохранить пользователя и не преобразовать его в пользовательский ресурс, когда вы его прочитаете?
3. Не могли бы вы, пожалуйста, объяснить свою идею, основанную на изменении моего кода, пожалуйста? может быть, это может мне помочь