Инициализация двойной скобки Java вызывает IllegalArgumentException: неизвестный объект - PullRequest
0 голосов
/ 25 октября 2018

Я просто пытаюсь создать веб-приложение CRUD с помощью Spring Boot, и обнаружил, что существует проблема с использованием двойной инициализации Java в платформе.

Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Unknown entity: com.example.service.impl.FileImageServiceImpl$1; nested exception is java.lang.IllegalArgumentException: Unknown entity:

У меня есть класс @Entity:

@Entity
public class RandomEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
//Getter and Setter
}

A @RestController

@RestController
public class RandomController{

    @Autowired
    private RandomRepository  randomRepository;

    @GetMapping("/create")
    public String create(){
        RandomEntity rdEntity = new RandomEntity(){{
                setName("Bla Bla");
            }};
        return randomRepository.save();
    }
}

Это хранилище

   public interface RandomRepository extends CrudRepository<RandomEntity, Long> {
    }

Но когда я изменяю инициализацию двойной скобки Java на обычную инициализацию, приложение запускаетсяправильно.

Знаете ли вы, почему это?Большое вам спасибо!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Я просто хочу завершить ответ @ Thilo . Если вы хотите чистый код, используйте Шаблон проектирования Builder , теперь вы можете легко реализовать этот дизайн с помощью Lombok библиотека, так что вы можете просто аннотировать вашу сущность следующим образом:

@Entity
@Getter @Setter @NoArgsConstructor @AllArgsConstructor
@Builder(toBuilder = true)
class RandomEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

Так что есть действительно несколько классных аннотаций, например @Getter и @Setter, чтобы избежать всех этих методов получения и установки, @Builder(toBuilder = true) для работы с дизайном строителя, чтобы ваш контроллер мог выглядеть так:

@GetMapping("/create")
public RandomEntity create() {

    // Create your Object via Builder design
    RandomEntity rdEntity = RandomEntity.builder()
            .name("Bla Bla")
            .build();

    // Note also here save should take your Object and return RandomEntity not a String
    return randomRepository.save(rdEntity);
}
0 голосов
/ 25 октября 2018

Это может выглядеть как изящный ярлык, который просто вызывает конструктор вашего класса, за которым следуют некоторые методы инициализации созданного экземпляра, но то, что на самом деле делает так называемая двойная инициализация , это создайте подкласс вашего класса Entity.Hibernate больше не будет знать, как с этим справиться.

Так что постарайтесь избежать этого.У него много накладных расходов и ошибок, чтобы сэкономить несколько нажатий клавиш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...