Java &引用;找不到可接受的陈述”;使用springbootstarterweb

Java &引用;找不到可接受的陈述”;使用springbootstarterweb,java,json,spring,maven,spring-mvc,Java,Json,Spring,Maven,Spring Mvc,我试图使用springbootstarterweb创建一个rest服务,提供Java对象的JSON表示。据我所知,这个bootstarterwebjar应该通过Jackson自动处理到JSON的转换,但是我得到了这个错误 { "timestamp": 1423693929568, "status": 406, "error": "Not Acceptable", "exception": "org.springframework.web.HttpMediaTypeNotAcce

我试图使用
springbootstarterweb
创建一个rest服务,提供Java对象的JSON表示。据我所知,这个bootstarterwebjar应该通过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>
。。。但是调用
test
服务会产生上述错误
test2
test3
可以很好地工作,证明它一定是尝试转换为JSON失败了?我是否缺少一些配置问题或注释?从我能找到的所有示例中,不再需要为基本Jackson JSON转换注释类


非常感谢您的帮助。

您的UpdateResult没有公共获取程序,例如:

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

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

我相信默认情况下,自动发现已打开,并将尝试发现您的getter。您可以使用
@jsonautodect(getServiceability=Visibility.NONE)
禁用它,在您的示例中,将导致
[]

我使用
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) {
@RequestMapping(value=“/index entries/{id}”,
method=RequestMethod.GET,
products=MediaType.APPLICATION\u JSON\u值)
@定时
公共响应属性getIndexEntry(@PathVariable Long id){

我试图通过
Postman
调用
restful
端点,标题为
Accept:text/plain
,但我需要使用
Accept:application/json

将下面的依赖项添加到
pom.xml

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

com.fasterxml.jackson.dataformat
jackson数据格式xml
2.10.2

我的返回对象在类上没有@XmlRootElement注释。添加注释解决了我的问题

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

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

我必须在POM中显式调用json库的依赖项

一旦我添加了下面的依赖项,一切都正常了

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

com.google.code.gson
格森

如果使用@FeignClient,则添加例如

produces = "application/json"

对于@RequestMapping注释,我也面临着类似的问题 /部分/api/test@test.com


根据路径,Spring确定uri是用“.com”获取某个文件扩展名,并尝试使用不同的媒体类型进行响应,然后尝试使用预期的媒体类型。将path变量转换为请求参数后,对我有效。

接受的答案对Spring 5不正确。尝试将web服务的URL更改为.json!这是正确的修复方法。此处的详细信息与我有相同的异常,但原因是d不同的,我找不到任何关于这方面的信息,所以我会把它贴在这里。这只是一个容易忽略的错误

坏的:

好:


在我的例子中,我碰巧使用了lombok,显然与get和set有冲突,我有相同的例外。问题是,我使用了注释

@RepositoryRestController

而不是


@RestController

我在访问致动器时遇到此问题。将以下配置类放入解决了此问题:

@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());
    }
}
@配置
@EnableWebMvc
公共类MediaConverterConfiguration实现WebMVCConfiguer{
@豆子
公共映射Jackson2HttpMessageConverter jacksonConverter(){
映射Jackson2HttpMessageConverter mc=
新映射Jackson2HttpMessageConverter();
列出支持的媒体类型=
新的ArrayList(mc.getSupportedMediaTypes());
支持的媒体类型
.add(MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE));
supportedMediaTypes.add(
valueOf(“application/vnd.spring boot.exactor.v2+json”);
mc.设置支持的媒体类型(支持的媒体类型);
返回mc;
}
@凌驾

public void configureMessageConverters(列表出现类似问题,当时我的一个控制器使用空
@GetMapping

截取所有请求时,我遇到了完全相同的问题。查看此参考资料后:

我的问题通过改变来解决

method=RequestMethod.GET,products=“application/json;charset=UTF-8”

method=RequestMethod.GET,products=MediaType.TEXT\u PLAIN\u VALUE

别忘了添加库:

import org.springframework.http.MediaType;

它可以在邮递员或普通浏览器上使用。

如果您使用的是Lombok,请确保它有@Data或@Getter之类的注释
@Setter
在响应模型类中。

在我的例子中,我在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);
}
@PostMapping(value=“/get customer details”,products={MediaType.APPLICATION\u JSON\u value})
public ResponseEntity getCustomerDetails(@RequestBody String requestMessage)引发JSONException{
JSONObject JSONObject=新的JSONObject();
jsonObject.put(“customerId”、“123”);
jsonObject.put(“手机号码”、“XXX-XXX-XXXX”);
返回新的ResponseEntity(jsonObject.toString(),HttpStatus.OK);
}
不正确:

return new ResponseEntity<>(jsonObject, HttpStatus.OK);
返回新的响应属性(jsonObject,HttpStatus.OK);
因为jsonObject的toString()方法“将jsonObject编码为压缩JSON字符串”。因此,Spring直接返回JSON字符串,而无需进一步序列化


当我们改为发送jsonObject时,Spring尝试基于RequestMapping中使用的Products方法对其进行序列化,但由于“找不到可接受的表示”而失败。

对于我来说,问题是试图在url中传递一个带点的文件名。例如

”http://localhost:8080/something/asdf.jpg“//由于“.jpg”而导致错误
它可以通过不传递.jpg扩展名或发送来解决
import org.springframework.http.MediaType;
@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);
<dependency>
     <groupId>org.codehaus.jackson</groupId>
     <artifactId>jackson-mapper-asl</artifactId>
     <version>1.9.9</version>
</dependency>