programing

spring-boot-starter-web을 사용하여 "허용 가능한 표현을 찾을 수 없습니다"

sourcetip 2023. 1. 10. 21:36
반응형

spring-boot-starter-web을 사용하여 "허용 가능한 표현을 찾을 수 없습니다"

는 용하려합합 i i i i i를 사용하려고 합니다.spring-boot-starter-webJava JSON의 REST에 대해 설명합니다.이 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.xmlhascontracty 있 。

<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-boot-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위에서 시킵니다.service는 위의 오류를 발생시킵니다. test2 ★★★★★★★★★★★★★★★★★」test3JSON으로의 변환 시도가 실패했을 뿐이라는 것을 증명하는 것은 문제 없습니다.구성 문제 또는 주석이 누락되어 있습니까?제가 찾을 수 있는 모든 예에서 기본 잭슨 JSON 변환을 위해 클래스에 주석을 달 필요가 없습니다.

아무쪼록 잘 부탁드립니다.

UpdateResult에 대한 공개 getter가 없습니다.다음은 예를 제시하겠습니다.

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

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

디폴트로는 자동검출이 켜져 있으며, getter를 검출하려고 합니다.할 수 .@JsonAutoDetect(getterVisibility=Visibility.NONE) 이 예에서는 [].

도 비슷한 요.spring/jhipsterRESTful 경유)Postman)

엔드포인트는 다음과 같습니다.

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

하려고 restful 경유Postmanheader " " " 가 Accept: text/plain 나는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★Accept: application/json

나도 비슷한 문제에 직면해 있었다.내 경우 요청 경로가 메일 ID를 경로 변수로 받아들였기 때문에 uri는 /some/api/test@test.com처럼 보였다.

그리고 경로를 기반으로 Spring은 확장자 ".com"을 가진 파일을 가져오는 URI를 결정하고 응답에 의도한 미디어 유형이 아닌 다른 미디어 유형을 사용하려고 했습니다.경로 변수를 요청 매개 변수로 만든 후 작동했습니다.

Lombok을 사용하는 경우 Response Model 클래스에 @Data 또는 @Getter @Setter와 같은 주석이 있는지 확인하십시오.

@FeignClient를 사용하는 경우 예를 추가합니다.

produces = "application/json"

@RequestMapping 주석 연결

를 더하세요.pom.xml:

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

액튜에이터에 접속할 때 이 문제가 발생하였습니다.다음 구성 클래스를 넣으면 문제가 해결되었습니다.

@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());
    }
}

제 경우와 같이 위의 모든 것을 해도 406 - Not acceptable when used from postman.자세히 조사한 결과 요청 헤더에서 'accept'의 기본 헤더는 '/'입니다.

헤더에 프리셋을 추가하고 디폴트 헤더를 끄고 문제를 해결했습니다.아래의 스크린샷을 참조해 주세요.

우체부 사전 설정 스크린샷

이것으로 다른 설정이나 스프링 구성을 추가하지 않아도 문제가 해결되었습니다.

반환 객체의 클래스에 @XmlRootElement 주석이 없습니다.주석을 달아서 문제가 해결되었다.

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

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

저도 똑같은 문제가 생겼어요.이 레퍼런스를 참조하면, https://zetcode.com/springboot/requestparam/ 를 참조해 주세요.

나의 고민은 변경으로 해결되었다.

method = RequestMethod.GET, produces = "application/json;charset=UTF-8"

로.

method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE

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

import org.springframework.http.MediaType;

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

제 경우 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에서 사용되는 products 메서드를 기반으로 jsonObject를 시리얼화하려고 시도하지만 "Could not find acceptable representation"으로 인해 실패합니다.

POM에서 json 라이브러리의 종속성을 명시적으로 호출해야 했습니다.

아래 종속성을 추가하면 모든 것이 작동했습니다.

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

내 경우 우연히 롬복을 사용했는데 get and set과 충돌이 있는 것 같다.

저도 같은 예외가 있었어요.문제는 내가 주석을 사용했다는 것입니다.

@RepositoryRestController

대신

@RestController

컨트롤러 중 하나가 빈 상태로 모든 요청을 대행 수신할 때 유사한 문제가 발생함@GetMapping

저에게 문제는 파일명을 점으로 URL에 전달하려고 하는 것이었습니다.예를들면

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

이 문제는 확장자 .jpg를 전달하지 않거나 요청 본문에 모두 전송함으로써 해결할 수 있습니다.

같은 문제가 발생했는데 셋업 중에 누락되어 maven(pom.xml) 파일에 포함되어 있지 않았습니다.

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

테스트에 우체부를 사용하고 헤더를 확인하려고 합니다.실수는 "Accept" 행의 application/json 대신 application/xml을 사용하고 있다는 것입니다.

승인된 답변은 Spring 5와 맞지 않습니다. 웹 서비스의 URL을 .json!으로 변경해 보십시오.이것이 올바른 수정입니다.자세한 내용은 이쪽 http://stick2code.blogspot.com/2014/03/solved-orgspringframeworkwebhttpmediaty.html에서 확인하실 수 있습니다.

저도 같은 예외가 있었는데 원인이 달라서 거기에 대한 정보를 찾을 수 없어서 여기에 올립니다.실수를 간과하는 것은 간단했다.

불량:

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

양호:

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

언급URL : https://stackoverflow.com/questions/28466207/could-not-find-acceptable-representation-using-spring-boot-starter-web

반응형