HttpMessageNotWritableException: не найден преобразователь для возвращаемого значения типа: class java.util.HashMap в Spring MVC

Я пытаюсь вернуть json, используя HashMap, как это, в методе контроллера

//list all users
    @RequestMapping(value = "/user",method = RequestMethod.GET)
    public ResponseEntity<Map<String,Object>> handleRequest() throws Exception{
        List<User> users = userService.list();          
        Map<String, Object> message = new HashMap<String, Object>();

        message.put("severity", "info");
        message.put("user", users);
        message.put("summary", "Not successfully.");
        message.put("code", 200);

        Map<String, Object> json = new HashMap<String, Object>();
        json.put("success", true);
        json.put("message", message);

        return new ResponseEntity<Map<String,Object>>(message,HttpStatus.CREATED);
    }

Когда я нажимаю этот метод в PostMan, я получаю эту ошибку

org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class java.util.HashMap
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:226)
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:180)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:119)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866)
javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Вот как я настроил приложение

@Configuration
@ComponentScan("com.fyt.fyt")
@EnableTransactionManagement
public class ApplicationContextConfig {


    @Bean
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        internalResourceViewResolver.setPrefix("/WEB-INF/views/");
        internalResourceViewResolver.setSuffix(".jsp");
        return internalResourceViewResolver;
    }

    @Bean
    public DataSource getDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/fyt");
        dataSource.setUsername("root");
        dataSource.setPassword("");
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean getSessionFactory() {

        LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
        factoryBean.setDataSource(getDataSource());
        factoryBean.setHibernateProperties(getHibernateProperties());
        factoryBean.setAnnotatedClasses(User.class);
        return factoryBean;

    }

    private Properties getHibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        return properties;
    }

    @Bean
    public HibernateTransactionManager getTransactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(getSessionFactory().getObject());
        return transactionManager;
    }

    @Bean
    public UserDao userDao() {
        return new UserDaoImpl();
    }
}

В сообщении об ошибке говорится, что он не может преобразовать список в httpmessges, поэтому мне нужны какие-либо преобразователи или что-то в этом роде? Что мне чего-то не хватает?

Похоже, у вас неправильно настроены конвертеры. Вам нужно будет поделиться дополнительной информацией о настройке Spring. Это устаревшее приложение, в которое вы добавляете JSON, или современный проект Spring Boot?

chrylis -cautiouslyoptimistic- 25.05.2018 07:52

Это устаревшее приложение, я отредактировал вопрос, проверьте

theanilpaudel 25.05.2018 08:00

Вы пробовали это решение? Решение

Rafał Sokalski 25.05.2018 08:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
19 667
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете просто вернуть Map, подобную этой, и аннотацию пользователя @RestController поверх вашего класса:

    @RequestMapping(value = "/user",method = RequestMethod.GET)
    public Map<String,Object> handleRequest() throws Exception{
        List<User> users = userService.list();          
        Map<String, Object> message = new HashMap<String, Object>();

        message.put("severity", "info");
        message.put("user", users);
        message.put("summary", "Not successfully.");
        message.put("code", 200);

        Map<String, Object> json = new HashMap<String, Object>();
        json.put("success", true);
        json.put("message", message);

        message.putAll(json);
        return message;
    }

Есть ли в вашем классе User метод установки и получения?

Sudhir Ojha 25.05.2018 07:17

Да, есть геттеры и сеттеры

theanilpaudel 25.05.2018 07:32

Оберните код в try catch и опубликуйте полную трассировку стека ошибки.

Sudhir Ojha 25.05.2018 07:38

Я добавил полную трассировку стека

theanilpaudel 25.05.2018 07:48
Ответ принят как подходящий

Предоставьте @RestController на уровне класса контроллера, в противном случае предоставьте @ResponseBody на уровне метода. Убедитесь, что все jar-файлы, связанные с Джексоном, находятся в пути к классам.

Добавьте зависимости, связанные с Джексоном, в свой pom.xml

@RequestMapping(value = "/user",method = RequestMethod.GET)
@ResponseBody
    public ResponseEntity<Map<String,Object>> handleRequest() throws Exception{
        List<User> users = userService.list();          
        Map<String, Object> message = new HashMap<String, Object>();

        message.put("severity", "info");
        message.put("user", users);
        message.put("summary", "Not successfully.");
        message.put("code", 200);

        Map<String, Object> json = new HashMap<String, Object>();
        json.put("success", true);
        json.put("message", message);

        return new ResponseEntity<Map<String,Object>>(message,HttpStatus.CREATED);
    }

Примеры зависимостей pom для jackson.

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
        </dependency>

Это было из-за зависимостей, поэтому добавление зависимостей решило проблему.

theanilpaudel 28.05.2018 13:53

Думаю, для этого вам понадобится собственный httpmessageconvertor. добавить зависимость

<dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.5.0</version>
</dependency>

если это не работает, попробуйте настроить пользовательскую конфигурацию для MappingJackson to HttpMessage Convertor в своем файле конфигурации.

Для тех, кто сталкивается с аналогичной проблемой:

Это может произойти, если вы возвращаете объект класса, у которого нет методов Getter и Setter.

Например: если у вас есть следующие настройки

public class Employee {
    private int code;
    private String name;
}

И используя его в каком-то методе как таковом:

@GetMapping("")
public ResponseEntity<Employee> getEmployee(@RequestParam("id") Integer id) {
    Employee employee;
    /* CODE. . . 
                */
    return new ResponseEntity<>(employee, HttpStatus.OK);
 }

Вы можете получить сообщение об ошибке

org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class com.dummy.springWeb.ExceptionHandler.Employee

Чтобы решить эту проблему, просто добавьте геттеры и сеттеры в класс сотрудника, и это решит проблему!

спасла мне жизнь, а для тех, кто использует ломбок, просто добавьте @Data в свою запись

Catalina 19.03.2021 09:44

Другие вопросы по теме