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>