>source

사용하려고 합니다스프링 부트 스타터 웹Java 객체의 JSON 표현을 제공하는 나머지 서비스를 생성합니다. 내가 이해한 바에 따르면 이 boot-starter-web jar는 자동으로 Jackson을 통해 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 종속성:트리spring-boot-starter-web은 실제로 jackson2.4 databind에 의존하므로 classpath에 있어야 함을 보여줍니다...

[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

... 아직 호출 중시험서비스는 위에서 언급한 오류를 제공합니다.테스트2그리고테스트3실패한 JSON으로의 변환을 시도해야 함을 증명하면 잘 작동합니까? 일부 구성 문제 또는 주석이 누락되었습니까? 내가 찾을 수 있는 모든 예제에서 기본 Jackson JSON 변환을 위한 클래스에 주석을 추가할 필요가 더 이상 없습니다.

도움을 주시면 감사하겠습니다.

그건 그렇고 최신 스프링(언제 추가되었는지 확실하지 않음)이 훨씬 더 잘 작동합니다. 작년에 실수로 다시 실수를 저질렀고 위의 수수께끼 같은 오류 대신 내가 무엇을 잘못했는지 정확히 알려주는 오류가 발생했습니다(텍스트는 기억나지 않지만...). 이를 개선하는 팀에 감사드립니다.

crowmagnumb2021-11-11 09:42:10
  • 답변 # 1

    위의 모든 작업을 수행하더라도 제 경우처럼 여전히 오류 406 -우편 배달부에서 사용할 때 허용되지 않습니다. 주의 깊게 연구한 결과 요청 헤더에서 '수락'의 기본 헤더가 '/'인 것을 발견했습니다.

    헤더에 사전 설정을 추가하고 기본 헤더를 해제하여 문제를 해결했습니다. 아래 스크린샷을 참조하십시오.

    이것은 다른 설정이나 스프링 구성을 추가하지 않고도 내 문제를 해결했습니다.

  • 답변 # 2

    동일한 문제가 발생했고 설정에서 누락된 부분은 이를 maven(pom.xml) 파일에 포함하는 것이었습니다.

    <dependency>     <groupId>org.codehaus.jackson</groupId>     <artifactId>jackson-mapper-asl</artifactId>     <version>1.9.9</version></dependency>

  • 답변 # 3

    저에게 문제는 URL에 점이 있는 파일 이름을 전달하는 것이었습니다. 예를 들어

    "http://localhost:8080/something/asdf.jpg" //causes error because of '.jpg'
    

    .jpg 확장자를 전달하지 않거나 요청 본문에 모두 전송하여 해결할 수 있습니다.

  • 답변 # 4

    제 경우에는 ResponseEntity에 올바른 개체를 보내고 있었습니다. > ().

    맞다:

    @PostMapping(value= "/get-customer-details", produces= { MediaType.APPLICATION_JSON_VALUE })
    public ResponseEntity<?> getCustomerDetails(@RequestBody String requestMessage) throws JSONException {
        JSONObject jsonObject= new JSONObject();
        jsonObject.put("customerId", "123");
        jsonObject.put("mobileNumber", "XXX-XXX-XXXX");
        return new ResponseEntity<>(jsonObject.toString(), HttpStatus.OK);
    }
    

    잘못:

    return new ResponseEntity<>(jsonObject, HttpStatus.OK);
    

    jsonObject의 toString() 메서드는 "jsonObject를 컴팩트 JSON 문자열로 인코딩"하기 때문입니다. 따라서 Spring은 추가 직렬화 없이 json 문자열을 직접 반환합니다.

    대신 jsonObject를 보내면 Spring은 RequestMapping에서 사용된 생성 메소드를 기반으로 직렬화를 시도하고 "허용되는 표현을 찾을 수 없음"으로 인해 실패합니다.

  • 답변 # 5

    롬복을 사용하는 경우 @Data 또는 @Getter와 같은 주석이 있는지 확인하세요. 응답 모델 클래스의 @Setter.

  • 답변 # 6

    똑같은 문제가 발생했습니다. 이 참조를 본 후: http://zetcode.com/springboot/requestparam/

    변경하여 문제가 해결되었습니다.

    메서드= RequestMethod.GET, 생성= "application/json;charset=UTF-8"

    메서드= RequestMethod.GET, 생성= MediaType.TEXT_PLAIN_VALUE

    그리고 라이브러리를 추가하는 것을 잊지 마십시오:

    import org.springframework.http.MediaType;
    

    우편 배달부 또는 일반 브라우저에서 모두 작동합니다.

  • 답변 # 7

    아래 종속성을 귀하의pom.xml:

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

    위에 올바른 잭슨 종속성(이것이 아님)이 이미 있음을 보여줍니다. 따라서 이것은 문제의 해결책이 아닙니다. 솔루션은 이미 @ikumen이 제공했습니다.

    crowmagnumb2021-11-10 16:39:46

    이 종속성이 없으면 동일한 오류가 발생합니다. 따라서 일부 경우에는 정확하므로 이 답변에 투표하지 마십시오.

    Joe2021-11-11 01:03:46

    글쎄, 나는 그것을 허용하지 않기 때문에 지금 그것을 취소 할 수 없습니다. 그러나 그것은 여전히 ​​내 원래 질문에 대한 대답이 아닙니다. 나는 그것이 다른 사람들에게 도움이되기를 바랍니다.

    crowmagnumb2021-11-11 01:03:46

    이것은 위의 문제가 아니지만 생성= { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE }을 사용하고 application/xml을 요청하면 올바른 솔루션입니다.

    Cavva792021-11-11 01:18:10
  • 답변 # 8

    컨트롤러 중 하나가 비어 있는 모든 요청을 가로챌 때 유사한 문제가 발생했습니다.@GetMapping

  • 답변 # 9

    액츄에이터에 액세스할 때 이 문제가 발생했습니다. 다음 구성 클래스를 추가하면 문제가 해결되었습니다.

    @Configuration
    @EnableWebMvc
    public class MediaConverterConfiguration implements WebMvcConfigurer {
        @Bean
        public MappingJackson2HttpMessageConverter jacksonConverter() {
            MappingJackson2HttpMessageConverter mc=
                    new MappingJackson2HttpMessageConverter();
            List<MediaType> supportedMediaTypes=
                    new ArrayList<>(mc.getSupportedMediaTypes());
            supportedMediaTypes
                    .add(MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE));
            supportedMediaTypes.add(
                MediaType.valueOf("application/vnd.spring-boot.actuator.v2+json"));
            mc.setSupportedMediaTypes(supportedMediaTypes);
            return mc;
        }
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.add(jacksonConverter());
        }
    }
    

  • 답변 # 10

    나도 같은 예외가 있었습니다. 문제는 주석을 사용했다는 것입니다.

    @RepositoryRestController

    대신

    @RestController

    감사 해요! 이 작업을 시도했지만 같은 이유로 작동하지 않았습니다.

    GuiRitter2021-11-11 04:39:46
  • 이전 node.js : 리소스 로드 실패: 서버가 503(서비스를 사용할 수 없음) 상태로 응답했습니다. favicon.ico
  • 다음 php : Postgresql/Docker -사용자 "user"에 대한 비밀번호 인증 실패