it-roy-ru.com

"Не удалось найти приемлемое представление" с помощью spring-boot-starter-web

Я пытаюсь использовать spring-boot-starter-web для создания службы отдыха, обслуживающей JSON-представления Java-объектов. Из того, что я понимаю, этот jar boot-starter-web должен обрабатывать преобразование в JSON через Джексона автоматически, но вместо этого я получаю эту ошибку.

{ "timestamp": 1423693929568,
  "status": 406,
  "error": "Not Acceptable",
  "exception": "org.springframework.web.HttpMediaTypeNotAcceptableException",
  "message": "Could not find acceptable representation"
}

Мой контроллер это ...

@RestController
@RequestMapping(value = "/media")
public class MediaController {
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public @ResponseBody UploadResult test(@RequestParam(value="data") final String data) {
      String value = "hello, test with data [" + data + "]"; 
      return new UploadResult(value);
    }

    @RequestMapping(value = "/test2", method = RequestMethod.POST)
    public int test2() {
        return 42;
    }

    @RequestMapping(value = "/test3", method = RequestMethod.POST)
    public String test3(@RequestParam(value="data") final String data) {
        String value = "hello, test with data [" + data + "]"; 
        UploadResult upload = new UploadResult(value);
        return upload.value;
    }


    public static class UploadResult {
        private String value;
        public UploadResult(final String value)
        {
            this.value = value;
        }
    }
}

Мой pom.xml имеет ...

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.2.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-Tomcat</artifactId>
        <version>1.2.1.RELEASE</version>
        <scope>provided</scope>
    </dependency>

mvn dependency:tree показывает, что spring-boot-starter-web действительно зависит от привязки данных jackson2.4 и, следовательно, должен находиться на пути к классам ...

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.2.1.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:1.2.1.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot:jar:1.2.1.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:1.2.1.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:1.2.1.RELEASE:compile
[INFO] |  |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.8:compile
[INFO] |  |  |  \- org.slf4j:log4j-over-slf4j:jar:1.7.8:compile
[INFO] |  |  \- org.yaml:snakeyaml:jar:1.14:runtime
[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.4.4:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.4.0:compile
[INFO] |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.4.4:compile
[INFO] |  +- org.hibernate:hibernate-validator:jar:5.1.3.Final:compile
[INFO] |  |  +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] |  |  +- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile
[INFO] |  |  \- com.fasterxml:classmate:jar:1.0.0:compile
[INFO] |  +- org.springframework:spring-web:jar:4.1.4.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-aop:jar:4.1.4.RELEASE:compile
[INFO] |  |  |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  |  +- org.springframework:spring-beans:jar:4.1.4.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-context:jar:4.1.4.RELEASE:compile
[INFO] |  \- org.springframework:spring-webmvc:jar:4.1.4.RELEASE:compile
[INFO] |     \- org.springframework:spring-expression:jar:4.1.4.RELEASE:compile

... все же вызов службы test приводит к ошибке, упомянутой выше. test2 и test3 отлично работают, доказывая, что это просто неудачная попытка преобразования в JSON? Я пропускаю какие-то проблемы конфигурации или аннотации? Из всех примеров, которые я могу найти, аннотирование класса для базового преобразования JSON Джексона больше не требуется.

Любая помощь с благодарностью.

39
crowmagnumb

У вас нет общедоступных получателей для вашего UpdateResult, например:

public static class UploadResult {
    private String value;
    public UploadResult(final String value)
    {
        this.value = value;
    }

    public String getValue() {
       return this.value;
    }
}

Я полагаю, что по умолчанию автоматическое обнаружение включено, и я попытаюсь обнаружить ваши получатели Вы можете отключить его с помощью @JsonAutoDetect(getterVisibility=Visibility.NONE), и в вашем примере это приведет к [].

60
ikumen

У меня была похожая ошибка при использовании сервиса spring/jhipster RESTful (через Postman)

Конечная точка была что-то вроде:

@RequestMapping(value = "/index-entries/{id}",
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<IndexEntry> getIndexEntry(@PathVariable Long id) {

Я пытался вызвать конечную точку restful через Postman с заголовком Accept: text/plain, но мне нужно было использовать Accept: application/json

9
wired00

Я тоже столкнулся с подобной проблемой. В моем случае путь запроса принимал почтовый идентификатор в качестве переменной пути, поэтому uri выглядел как /some/api/[email protected]

Основываясь на пути, Spring определил, что нужно извлечь какой-то файл с расширением ".com", и пытался использовать другой тип мультимедиа для ответа, чем предполагалось. После внесения переменной пути в параметр запроса у меня это сработало.

4
Kranthi Kiran

Мой возвращаемый объект не имел аннотации @XmlRootElement в классе. Добавление аннотации решило мою проблему.

@XmlRootElement(name = "ReturnObjectClass")
public class ReturnObjectClass {

    @XmlElement(name = "Status", required = true)
    protected StatusType status;
    //...
}
2
Vasudev

Если вы используете @FeignClient, добавьте, например,.

produces = "application/json"

на аннотацию @RequestMapping

2
charlb

в Spring 5. принят неправильный ответ. попробуйте изменить свой URL-адрес веб-службы на .json! это правильное решение. подробности здесь http://stick2code.blogspot.com/2014/03/solved-orgspringframeworkwebhttpmediaty.html

0
tom

Я должен был явно вызвать зависимость для моей библиотеки JSON в моем POM.

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

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>
0
thernandez

У меня было то же исключение, но причина была в другом, и я не смог найти никакой информации об этом, поэтому я опубликую это здесь. Это была простая ошибка.

Плохой:

@RestController(value = "/api/connection")

Хорошо:

@RestController
@RequestMapping(value = "/api/connection")
0
Dominik H.