Многомодульный Maven, Spring MVC, Hibernate и Tomcat для ответа json-> error 404 - PullRequest
0 голосов
/ 22 сентября 2019

Я новичок в мире Весны.Я сделал небольшое упражнение, используя 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();
    }

}

Можете ли вы помочь мне?Я не знаю, в чем может быть проблема.

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