我有一个基于Jersey的Rest WS输出JSON。我正在实现一个Jersey客户端来调用WS并使用JSON响应。我的客户代码在
之下WebResource r = restClient.resource(UriBuilder.fromUri("http://localhost/").port(8080).build()); String resp = r.path("/user").accept(MediaType.APPLICATION_JSON).get(String.class); User[] users = r.path("/user").accept(MediaType.APPLICATION_JSON).get(User[].class);
第二行正确输出JSON字符串响应,但是没有发生第三行将JSON编组到POJO,我得到以下异常堆栈跟踪
SEVERE: A message body reader for Java class [Lorg.shoppingsite.model.entity.jpa.User;, and Java type class [Lorg.shoppingsite.model.entity.jpa.User;, and MIME media type application/json was not found Dec 21, 2011 11:32:01 AM com.sun.jersey.api.client.ClientResponse getEntity SEVERE: The registered message body readers compatible with the MIME media type are: */* -> com.sun.jersey.core.impl.provider.entity.FormProvider com.sun.jersey.core.impl.provider.entity.StringProvider com.sun.jersey.core.impl.provider.entity.ByteArrayProvider com.sun.jersey.core.impl.provider.entity.FileProvider com.sun.jersey.core.impl.provider.entity.InputStreamProvider com.sun.jersey.core.impl.provider.entity.DataSourceProvider com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General com.sun.jersey.core.impl.provider.entity.ReaderProvider com.sun.jersey.core.impl.provider.entity.DocumentProvider com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General com.sun.jersey.core.impl.provider.entity.EntityHolderReader
我的请求中有正确的MIME类型。我的POJO已使用XMLRootElement注释。我错过了什么
谢谢
答案 0 :(得分:29)
我能够通过为jersey-json添加maven依赖来解决问题。
答案 1 :(得分:25)
要使它工作,你只需要两件事。检查您是否遗失:
如果您缺少,则需要为 jersey-json 添加依赖项。作为参考,我将此依赖项添加到我的pom.xml中。
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.17.1</version>
</dependency>
答案 2 :(得分:10)
刚刚把这个
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
答案 3 :(得分:10)
我知道这篇文章已经很久了,你很久以前就已经知道了这个帖子,但只是为了挽救那些会读这篇文章的人。
您可能忘记将注释添加到要传递给端点的实体,因此Jersey不知道如何处理它收到的POJO。 用这样的东西注释pojo:
@XmlRootElement(name = "someName")
答案 4 :(得分:8)
如果您正在构建一个uberjar或&#34;阴影jar&#34;,请确保合并了meta inf服务文件。 (这在dropwizard项目中多次出现。)
如果您使用的是gradle shadowJar插件,则需要在mergeServiceFiles()
目标中调用shadowJar
:https://github.com/johnrengelman/shadow#merging-service-files
不确定maven或其他构建系统的类似命令是什么。
答案 5 :(得分:4)
我们还决定使用运动衫作为解决方案。但是,由于我们在大多数情况下使用org.JSON,这种依赖是不必要的,我们觉得不好。
因此我们使用String表示来获取org.JSON对象,而不是
JSONObject output = response.getEntity(JSONObject.class);
我们现在就这样使用它:
JSONObject output = new JSONObject(response.getEntity(String.class));
其中JSONObject来自org.JSON,导入可以从:
更改-import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
答案 6 :(得分:3)
就我而言,我正在使用POJO。我忘了将POJOMappingFeature配置为true。 梅康在早期的回答中指出了这一点。但是有些人可能无法在web.xml中正确配置它,这是我的例子。
<servlet>
<servlet-name>Jersey Servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
答案 7 :(得分:3)
在课程开始之前,只需在POJO中添加以下行,您的问题就会得到解决。 @Produces(&#34;应用/ JSON&#34) @XmlRootElement 见例子 import javax.ws.rs.Produces; import javax.xml.bind.annotation.XmlRootElement;
/**
* @author manoj.kumar
* @email kumarmanoj.mtech@gmail.com
*/
@Produces("application/json")
@XmlRootElement
public class User {
private String username;
private String password;
private String email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
add below lines inside of your web.xml
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Now recompile your webservice everything would work!!!
答案 8 :(得分:2)
尝试添加:
self.navigationController.navigationBar.isTranslucent = false
如果您将<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>1.4</version>
</dependency>
与邮件正文一起使用,也可能会出现此问题,因此在这种情况下添加jersey-json lib,HTTP GET
或修改web.xml将无济于事。您应该使用网址@XmlRootElement
或QueryParam
。
答案 9 :(得分:0)
您需要为自己的班级MessageBodyReader
实施自己的MessageBodyWriter
和Lorg.shoppingsite.model.entity.jpa.User
。
package javax.ws.rs.ext;
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
public interface MessageBodyReader<T extends Object> {
public boolean isReadable(Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType);
public T readFrom(Class<T> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException;
}
package javax.ws.rs.ext;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
public interface MessageBodyWriter<T extends Object> {
public boolean isWriteable(Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType);
public long getSize(T t,
Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType);
public void writeTo(T t,
Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException, WebApplicationException;
}
答案 10 :(得分:0)
检查你是否在eclipse中运行不同的实例。我退出了所有其他会话,清理构建修复了问题
答案 11 :(得分:0)
有些人可能会感到困惑,为什么添加jersey-json jar无法解决这个问题。我发现这个罐子比jersey-json-1.7.jar更新(1.7.0不起作用,但1.7.1工作正常。)。希望这可以帮助
答案 12 :(得分:0)
对于Python和Swagger示例:
import requests
base_url = 'https://petstore.swagger.io/v2'
def store_order(uid):
api_url = f"{base_url}/store/order"
api_data = {
'id':uid,
"petId": 0,
"quantity": 0,
"shipDate": "2020-04-08T07:56:05.832Z",
"status": "placed",
"complete": "true"
}
# is a kind of magic..
r = requests.post(api_url, json=api_data)
return r
print(store_order(0).content)
MIME类型最重要的字符串: r = request.post(api_url,json = api_data)
答案 13 :(得分:0)
Q)代码在Intellj中工作正常,但在命令行中失败。
Sol)将球衣的依赖项添加为直接依赖项,而不是暂时性依赖项。
原因:由于与IntelliJ配合正常,因此正确配置了依赖项。
通过以下任一方式获取所需的依赖项:
mvn dependency:tree
的依赖项现在,显式添加那些有问题的球衣依赖项。
答案 14 :(得分:-3)
好的 - 解决方案:删除(或更正)对主项目属性文件的任何新更改。
是的,就是这样。事实上,我的项目是一个多模块的巨大的项目,你知道没有正确的依赖是一个罕见的情况,因为经常从git(RAC)获取。我的项目几乎所有可配置的东西都来自一个属性文件,这个文件大约有15个左右的模块(子项目),它们之间具有大量的内部依赖性。 jersey-json的依赖总是存在于我合并的父pom中。 XML注释不是问题,因为项目在修改后运行了大约100次。这里的一些解决方案指向web.xml和POJOMappingFeature之类的东西。在我的情况下,我甚至没有触及此版本中的webapp模块。所以无论如何,这个解决方案对我有用,我花时间在SO中记录这个以防万一我碰巧遇到这个错误,我不必浪费我昏昏欲睡的夜晚。 (当然,也适合你)