Произошла непредвиденная ошибка (тип = неприемлемо, статус = 406) для Spring @RestController, spring-boot

Я пытаюсь вернуть xml из моего метода @RestController -

@RestController
public class MCSController {
.
.
@RequestMapping(value = "/encoders", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON,
        MediaType.APPLICATION_XML })
public List<EncoderVO> getEncoders() {

    List<EncoderVO> encoders = null;
    try {
        encoders = infoService.listEncoders();
    } catch (MCSException e) {
        logger.error("Error in listing encoders : " + e.getMessage());
    }
    return encoders;
}

Вот мой EncoderVO.java -

@XmlRootElement
public class EncoderVO {

@XmlElement
private Long id;

@XmlElement
private String name;

@XmlElement
private Boolean flagActive;

public EncoderVO() {
}

public EncoderVO(Long id, String name, Boolean flagActive) {
    super();
    this.id = id;
    this.name = name;
    this.flagActive = flagActive;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Boolean getFlagActive() {
    return flagActive;
}

public void setFlagActive(Boolean flagActive) {
    this.flagActive = flagActive;
}

}

Это мой файл pom.xml -

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

<groupId>com.test</groupId>
<artifactId>mcs</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- Inherit defaults from Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.RELEASE</version>
</parent>

<properties>
    <aws.sdk-version>1.9.1</aws.sdk-version>
    <liquibase.version>3.3.0</liquibase.version>
</properties>

<!-- Add typical dependencies for a web application -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>jackson-annotations</artifactId>
                <groupId>com.fasterxml.jackson.core</groupId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>jackson-annotations</artifactId>
                <groupId>com.fasterxml.jackson.core</groupId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-broker</artifactId>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- Aws SDK Dependencies -->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-s3</artifactId>
        <version>${aws.sdk-version}</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-elastictranscoder</artifactId>
        <version>${aws.sdk-version}</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-sqs</artifactId>
        <version>${aws.sdk-version}</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-sns</artifactId>
        <version>${aws.sdk-version}</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-datapipeline</artifactId>
        <version>${aws.sdk-version}</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>


        <artifactId>aws-java-sdk-cloudfront</artifactId>
            <version>${aws.sdk-version}</version>
        </dependency>

    </dependencies>

</project>

Ниже мой класс приложения -

@SpringBootApplication(exclude = { SpringBootWebSecurityConfiguration.class, LiquibaseAutoConfiguration.class })
@ComponentScan(basePackages = { "com.test.ott.mcs" })
@EnableAspectJAutoProxy
@EnableJms
@EntityScan("com.test.ott.mcs.entities")
@EnableJpaRepositories("com.test.ott.mcs.repository")
    public class MCSApplication {

    @Bean
    JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        // A core poll size of 3 threads and a maximum pool size of 10 threads
        factory.setConcurrency("3-10");
        return factory;
    }

    // Using factory pattern with spring annotation
    @Bean
    public FactoryBean serviceLocatorFactoryBean() {
        ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean();
        factoryBean.setServiceLocatorInterface(EncodingAPIFactory.class);
        return factoryBean;
    }

    public static void main(String args[]) {
        SpringApplication.run(MCSApplication.class, args);
    }

}

Когда я нажимаю URL/кодировщики в браузере, я получаю следующую ошибку:

Произошла непредвиденная ошибка (тип=Неприемлемо, статус=406). Не удалось найти приемлемое представление

Банки, связанные с Джексоном, в моем калсспате -

  • jackson-core-asl : 1.9.13
  • джексон-jaxrs : 1.9.13
  • jackson-mapper-asl : 1.9.13
  • Джексон-аннотации: 2.6.3
  • ядро Джексона: 2.6.3
  • Джексон-модуль-jaxb-аннотации: 2.2.3
  • jackson-jaxrs-json-провайдер: 2.2.3
  • jackson-jaxrs-base: 2.5.4
  • Джексон-привязка данных: 2.6.3

Итак, у меня есть MappingJackson2HttpMessageConverter в моем пути к классам.

Пожалуйста, предложите. Заранее спасибо.


person Deepesh verma    schedule 19.04.2016    source источник
comment
Можете ли вы добавить больше информации? Запрос, который вы отправляете на эту конечную точку (curl).   -  person emoleumassi    schedule 28.04.2016
comment
Это простой запрос на получение, который я нажимаю на приложение, работающее на моем сервере localhost (tomcat). - 'http:/localhost:8080/кодировщики'   -  person Deepesh verma    schedule 28.04.2016
comment
Jackson1 не поддерживается, и вы уверены, что версии jackson 2 присутствуют, поскольку вы их исключили (почему?). Также List<EncoderVo> недействителен для XML, поскольку это не тип XML, поэтому это не удастся.   -  person M. Deinum    schedule 29.04.2016
comment
@M.Deinum M.Deinum У меня есть jackson2 в моих зависимостях, которые я получаю из другого локального модуля, который я удалил из pom при публикации этого вопроса. Потому и исключение. Да, список не является типом xml, и, вероятно, поэтому он не работает. Как я могу заставить его работать с List<EncoderVo>? Спасибо.   -  person Deepesh verma    schedule 03.05.2016
comment
АФАИК, вы не можете. Вам нужно будет обернуть его в объект EnvoderVos, который, в свою очередь, имеет список. Вам нужно вернуть объект XML, иначе маршаллер не сможет его понять.   -  person M. Deinum    schedule 03.05.2016


Ответы (3)


Есть готовое решение, аналогичное JAX-RS, но с чуть худшим результатом. В решении используется jackson-dataformat-xml. Добавьте зависимость в свой проект:

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>

Ответ будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<List>
   <item>
      <id>1</id>
      <name>testEncoder1</name>
      <flagActive>true</flagActive>
   </item>
   <item>
      <id>2</id>
      <name>testEncoder2</name>
      <flagActive>true</flagActive>
   </item>
   <item>
      <id>3</id>
      <name>testEncoder3</name>
      <flagActive>true</flagActive>
   </item>
</List>

Для получения дополнительной информации см. Spring. Способ MVC (jackson-dataformat-xml)

person gourav dhiman    schedule 04.05.2016

пытаться

http://localhost:8080/mcs-0.0.1-SNAPSHOT/encoders.

mcs — это имя приложения, а 0.0.1-SNAPSHOT — его версия.

Если это не работает, вам нужно добавить глобальный путь в RequestController. Что-то типа:

@RestController
@RequestMapping(value = "/mcs")
public class MCSController {
.
.
@RequestMapping(value = "/encoders", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON,
        MediaType.APPLICATION_XML })
public List<EncoderVO> getEncoders() {

и этот запрос:

http://localhost:8080/mcs-0.0.1-SNAPSHOT/mcs/encoders

я надеюсь, что это поможет вам.

Ваше здоровье

person emoleumassi    schedule 29.04.2016
comment
Дело в том, что я могу получать журналы в своих методах контроллера, и он обращается к серверной части и извлекает список, но при преобразовании списка в XML это дает 406. - person Deepesh verma; 03.05.2016

Добавьте эту зависимость в свой POM.xml

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

проблема с версией этой банки. поэтому, пожалуйста, попробуйте это решение

person Akshay Vijay Jain    schedule 27.10.2017