Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Можно, но придется писать свое DTO для каждого конкретного случая. И вообще, использование DTO должно быть получше обосновано, ведь это своего рода антипаттерн, т.к. вызывает дублирование данных.
Конечно, было бы круто отдавать сериализатору всякий раз то, что он может съесть. Более того, если такой способ существует — так и надо делать
return Hibernate.isInitialized(value) ? value : null;
try {
return accessor.get(...);
} catch (LazyInitializationException ex) {
return null;
}
Но почему вы отказываете AccessorFactory быть вариантом?
Вот вы говорите: давайте сделаем 2 DTO: CompanyAndSuppliersDTO, CompanyAndCustomersDTO. Да давайте, я сам так неоднократно делал: получим помимо прочего 2 DTO + DAO c двумя методами (по одному на DTO). Если еще что-нибудь понадобится (к примеру, появятся новые ленивые колекции), надо будет добавлять новые DTO и методы соответственно.
Company getCompany(). Он дергается из сервисных методов:@Transactional
CompanyAndSuppliersDTO getCompanyAndSuppliersDTO()
@Transactional
CompanyAndCustomersDTO getCompanyAndCompanyDTO()
Но ведь это уровни созданы для вас, а не вы для уровней. Никто не заставляет обязательно следовать их букве
@Service
public class CompanyService {
@Autowired
private CompanyDAO companyDAO;
@Transactional
public Company getCompany(String fetchProfile) {
return companyDAO.getCompany(fetchProfile);
}
}@Controller
@RequestMapping("rest/company")
public class CompanyController {
@Autowired
private CompanyService companyService;
@RequestMapping(value = "/{respType:customers|suppliers}", method = RequestMethod.GET)
public void getData(@PathVariable String respType, Model model) {
String fetchProfile = ("customers".equals(respType)) ? "companyWithCustomers" : "companyWithSuppliers";
model.addAttribute(companyService.getCompany(fetchProfile));
}
}@RequestMapping(value = "/{respType:customers|suppliers}", method = RequestMethod.GET)
public void getXML(@PathVariable String respType, Model model) {
// Грубо говоря, этот метод определяет собой границы жизни HttpServleеRequest/Response, вернее то
// место, где мы можем до них добраться, сделав inject в один из параметров, например.
String fetchProfile = ("customers".equals(respType)) ? "companyWithCustomers" : "companyWithSuppliers";
model.addAttribute(
// Тут сессии еще не было
companyService.getCompany(fetchProfile)
// А тут она уже все сделала и закрылась
);
// Дальше Spring положит что надо в response и отправит его
}
JAXB vs. org.hibernate.LazyInitializationException