Я новичок в мире Весны.Я сделал небольшое упражнение, используя Maven (с многомодульной структурой), Spring Boot, Hibernate и Tomcat.Для моего ответа я создал общий класс Java с именем ResponseJson для настройки информации.Мультимодульная структура Maven работает отлично.На моей консоли я вижу правильный процесс Tomcat и Hibernate (с отображением URL), и нет исключений.Если я пытаюсь подключиться к localhost: 8080, это работает.Если я пытаюсь подключиться к localhost: 8080 / api / elencoMedicinali (он был сопоставлен!), Он выдает ошибку 404.
У меня есть этот класс для конфигурации Hibernate:
@Configuration
@PropertySource(value= {"classpath:/application.properties"})
@ComponentScan({"it.consip.gfr.deas.appr.config", "it.consip.gfr.deas.appr.dao", "it.consip.gfr.deas.appr.services"})
@EnableTransactionManagement
public class HibernateConfig {
@Autowired
private Environment env;
//metodo che crea una session Factory (che necessita dei dati di properties)
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] {"it.consip.gfr.deas.appr.entities"});
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getRequiredProperty("database.driver"));
dataSource.setUrl(env.getRequiredProperty("database.url"));
dataSource.setUsername(env.getRequiredProperty("database.username"));
dataSource.setPassword(env.getRequiredProperty("database.password"));
return dataSource;
}
@Bean
public Properties hibernateProperties() {
Properties prop = new Properties();
prop.put("hibernate.dialect", env.getRequiredProperty("hibernate.dialect"));
prop.put("hibernate.show_sql", env.getRequiredProperty("hibernate.show_sql"));
prop.put("hibernate.format_sql", env.getRequiredProperty("hibernate.format_sql"));
prop.put("hibernate.hbm2ddl.auto", env.getRequiredProperty("hibernate.hbm2ddl.auto"));
return prop;
}
@Bean
@Autowired
public HibernateTransactionManager getTransactionManager() {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory().getObject());
return txManager;
}
Затем это мой класс Java с именем ResponseJson:
public class ResponseJson<T> {
private int code;
private String error;
private Collection<T> content;
private String description;
public ResponseJson(int code, String error, Collection<T> content) {
this(code, error, content, "");
}
public ResponseJson(int code, String error, Collection<T> content, String description) {
this.code = code;
this.error = error;
this.content = content;
this.description = description;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
public Collection<T> getContent() {
return content;
}
public void setContent(List<T> content) {
this.content = content;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Это мой контроллер:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import it.consip.gfr.deas.appr.entities.Medicinale;
import it.consip.gfr.deas.appr.services.MedicinaleService;
import it.consip.gfr.deas.json.ResponseJson;
@CrossOrigin(origins = "*")
@RestController
@RequestMapping("/api")
public class MedicinaleController {
@Autowired
MedicinaleService medicinaleService;
@RequestMapping(value="/elencoMedicinali")
public ResponseJson<Medicinale> findAllMedicinale() {
return new ResponseJson<Medicinale>(HttpStatus.OK.value(), "",
medicinaleService.findAllMedicinali(), HttpStatus.OK.name());
}
}
И это мой инициализатор класса:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { HibernateConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/api" };
}
}
Тогда, Я создал класс для конфигурации:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.BeanNameViewResolver;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"it.consip.gfr.deas"})
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public View jsonTemplate() {
MappingJackson2JsonView view = new MappingJackson2JsonView();
view.setPrettyPrint(true);
return view;
}
@Bean
public ViewResolver viewResolver() {
return new BeanNameViewResolver();
}
}
У меня есть этот класс как сущность:
@Entity
@Table(name="medicinale")
public class Medicinale {
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private String id;
@Column
private String nome;
@Column
private String principio;
@Column
private String posologia;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getPrincipio() {
return principio;
}
public void setPrincipio(String principio) {
this.principio = principio;
}
public String getPosologia() {
return posologia;
}
public void setPosologia(String posologia) {
this.posologia = posologia;
}
}
И затем, у меня есть два класса для DAO:
public interface MedicinaleDAO {
public void addMedicinale(Medicinale m);
public void updateMedicinale(Medicinale m);
public List<Medicinale> listFullMedicinale();
public Medicinale getMedicinaleById(int id);
public void deleteMedicinale (int id);
}
Это реализация:
@Repository
public class MedicinaleDAOImpl implements MedicinaleDAO {
private static final Logger logger = LoggerFactory.getLogger(MedicinaleDAOImpl.class);
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory (SessionFactory sessionFactory) {
this.sessionFactory=sessionFactory;
}
@Override
public void addMedicinale(Medicinale m) {
Session session=this.sessionFactory.getCurrentSession();
session.persist(m);
logger.info("Medicinale aggiunto correttamente");
}
@Override
public void updateMedicinale(Medicinale m) {
Session session=this.sessionFactory.getCurrentSession();
session.saveOrUpdate(m);
logger.info("Medicinale aggiornato correttamente");
}
@SuppressWarnings("unchecked")
public List<Medicinale> listFullMedicinale() {
Session session=this.sessionFactory.getCurrentSession();
List<Medicinale>medicinaliList=session.createQuery("from Medicinale").list();
for(Medicinale m:medicinaliList) {
logger.info("Lista dei medicinali: " + m);
}
return medicinaliList;
}
@Override
public Medicinale getMedicinaleById(int id) {
Session session=this.sessionFactory.getCurrentSession();
Medicinale medicinale= (Medicinale) session.load(Medicinale.class, new Integer(id));
logger.info("Medicinale richiesto: " + medicinale);
return medicinale;
}
@Override
public void deleteMedicinale(int id) {
Session session=this.sessionFactory.getCurrentSession();
Medicinale medicinale = (Medicinale) session.load(Medicinale.class, new Integer(id));
if (medicinale !=null) {
session.delete(medicinale);
}
logger.info("Medicinale eliminato correttamente.");
}
}
И два класса для обслуживания:
public interface MedicinaleService {
public List<Medicinale> findAllMedicinali();
}
, и это реализация:
@Service
public class MedicinaleServiceImpl implements MedicinaleService{
@Autowired
private MedicinaleDAO medicinaleDAO;
@Override
@Transactional
public List<Medicinale> findAllMedicinali() {
return this.medicinaleDAO.listFullMedicinale();
}
}
Можете ли вы помочь мне?Я не знаю, в чем может быть проблема.