долго боролся с этой проблемой, и у меня странное чувство, что оно как-то связано с тем, как я устанавливаю свою аннотацию @Transactional.
Так что я хочу сделать?
- Я готовлю некоторые данные и сохраняю их с доступными репозиториями в базе данных.
Это можно найти здесь, в моем классе FormTest в prepareExampleApplication методе
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class FormTest {
@Autowired
private ApplicationRepository applicationRepository;
@Autowired
private AppActionRepository appActionRepository;
@Autowired
private RoleRepository roleRepository;
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private FormRepository formRepository;
@Autowired
private FormElementRepository formElementRepository;
@Autowired
private SectionRepository sectionRepository;
private Application application;
private InputField refInputField;
private Select refSelectBox;
@Before
public void prepareExampleApplication() {
Form form = formRepository.save(ModelFactory.getForm("Project"));
Application application = ModelFactory.getApplication("Example", form);
this.application = applicationRepository.save(application);
Role role = new Role();
role.setRoleName("ADMIN");
role.setApp(application);
role = roleRepository.save(role);
Section section = ModelFactory.getSection(form, null, null);
section = formElementRepository.save(section);
InputField inputField = ModelFactory.getInputField(form, section, section);
refInputField = formElementRepository.save(inputField);
//once again. Just for my own eyes to see if it is there
Iterable<Form> all = formRepository.findAll();
// lot more stuff
}
@Test
@Transactional
public void testUserInput() {
// first create a new container to give inouts
Long id = this.application.getEntity().getId();
// for the sake of debugging I am using the formRepo to really SEARCH for the persisted form AND IT IS THERE!!!
Form byId = formRepository.findById(id).orElseThrow(NotFoundException::new);
URI uri = this.restTemplate.postForLocation("/api/form/" + id + "/forminstance", null);
long containerId = TestHelper.extractId(uri);
}
}
Следующее, что я делаю, имея эти данные, это использую restTemplate и отправляю пост-запрос в службу REST. Вы можете найти вызов POST в методе test. По причинам отладки - и чтобы увидеть, что репозиторий работает - я ДЕЙСТВИТЕЛЬНО использую репозиторий для получения идентификатора формы вместо того, чтобы использовать поле класса, которое было заполнено методом подготовки. И форма будет возвращена !!
В моем сервисе отдыха я снова использую formRepository, ища сущность, которую я нашел ранее в тестовом классе. Но в этот раз хранилище ничего не возвращает. Только ноль. Я пробовал ОЧЕНЬ МНОГО разных вещей с установкой @Transactional в разных местах, но что бы я ни делал, formRepository в службе REST дает мне только 0 энтитов и ноль. Вот служба ОТДЫХА
@Service
@Api("FormService")
@Path("/form")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class FormService {
@Autowired
private FormInstanceRepository formInstanceRepository;
@Autowired
private FormRepository formRepository;
@Autowired
private FormElementRepository formElementRepository;
@Autowired
private UserInputRepository userInputRepository;
@POST
@Path("{id}/forminstance")
@Transactional
public Response createFormInstance(@Context UriInfo info, @PathParam("id") long formId) {
// returns ALWAYS 0 elements
Iterable<Form> all = formRepository.findAll();
// returns always null
Form form = formRepository.findById(formId).orElse(null);
FormInstance formInstance = new FormInstance();
formInstance.setForm(form);
FormInstance save = formInstanceRepository.save(formInstance);
UriBuilder builder = info.getAbsolutePathBuilder();
builder.path(Long.toString(save.getId()));
return Response.created(builder.build()).build();
}
Если вы знаете ответ, мне действительно интересно объяснение, чтобы понять мою ошибку. Я использую в памяти H2 db для тестов.
Добавление сущности Form и FormRepository тоже
@Entity
@Data
public class Form {
@Id
@GeneratedValue
private Long id;
private String name;
}
-
public interface FormRepository extends CrudRepository<Form, Long> {
}
Заранее спасибо за помощь !!