Java 未找到媒体类型为Application/json、glassfish的MessageBodyWriter
我正在使用JAX-RS创建简单的restful json,我的第一个方法工作得很好,但是当我添加第二个方法来获取所有vendorNOS“ID”方法时,我在浏览器中查看时出现了这个异常,我也调试restful服务,它工作得很好,它将所有vendorNOS“ID”都隐藏起来Java 未找到媒体类型为Application/json、glassfish的MessageBodyWriter,java,json,web-services,glassfish,Java,Json,Web Services,Glassfish,我正在使用JAX-RS创建简单的restful json,我的第一个方法工作得很好,但是当我添加第二个方法来获取所有vendorNOS“ID”方法时,我在浏览器中查看时出现了这个异常,我也调试restful服务,它工作得很好,它将所有vendorNOS“ID”都隐藏起来 vendorFacadeBean的输出是{1,2,3,4,5,6,11,13} HTTP状态500-内部服务器错误 类型异常报告 消息内部服务器错误 说明服务器遇到内部错误,无法满足此请求。 例外 javax.servlet.S
vendorFacadeBean的输出是{1,2,3,4,5,6,11,13}
HTTP状态500-内部服务器错误
类型异常报告
消息内部服务器错误
说明服务器遇到内部错误,无法满足此请求。
例外
javax.servlet.ServletException:org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:MessageBodyWriter未找到媒体类型=应用程序/json,类型=类java.util.Vector,genericType=java.util.List。
根本原因
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:未找到媒体类型=应用程序/json、类型=类java.util.Vector、genericType=java.util.List的MessageBodyWriter。
请注意,GlassFish Server开源版本4.0日志中提供了异常及其根本原因的完整堆栈跟踪。
GlassFish服务器开源版本4.0
java源代码
package resources;
import case2dtos.VendorEJBDTO;
import case2ejbs.VendorFacadeBean;
import java.util.List;
import javax.ejb.EJB;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.enterprise.context.RequestScoped;
/**
* REST Web Service
*
* @author abdallaelnajjar
*/
@Path("vendors")
@RequestScoped
public class VendorsResource {
@EJB
private VendorFacadeBean vendorFacadeBean;
@Context
private UriInfo context;
/**
* Creates a new instance of VendorsResource
*/
public VendorsResource() {
}
/**
* Retrieves representation of an instance of resources.VendorsResource
* @return an instance of java.lang.String
*/
@GET
@Path("getAVendor/{vendorno}")
@Produces("Application/json")
public VendorEJBDTO getAVendor(@PathParam("vendorno")int vendorno)
{
return vendorFacadeBean.getVendorInfo(vendorno);
}
/**
* Retrieves representation of an instance of resources.VendorsResource
* @return an instance of java.lang.String
*/
@GET
@Path("getVendornos")
@Produces("Application/json")
public List<Integer> getVendornos()
{
List<Integer> vendornosList = null;
try
{
vendornosList = vendorFacadeBean.getVendorsnos();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
return vendornosList;
}
}
包资源;
导入case2dtos.VendorEJBDTO;
导入case2ejbs.VendorFacadeBean;
导入java.util.List;
导入javax.ejb.ejb;
导入javax.ws.rs.core.Context;
导入javax.ws.rs.core.UriInfo;
导入javax.ws.rs.PathParam;
导入javax.ws.rs.Consumes;
导入javax.ws.rs.PUT;
导入javax.ws.rs.Path;
导入javax.ws.rs.GET;
导入javax.ws.rs.products;
导入javax.enterprise.context.RequestScope;
/**
*RESTWeb服务
*
*@作者abdallaelnajjar
*/
@路径(“供应商”)
@请求范围
公共类供应商资源{
@EJB
私人供应商;
@上下文
私有信息上下文;
/**
*创建VendorsResource的新实例
*/
公共供应商资源(){
}
/**
*检索resources.VendorsResource实例的表示形式
*@返回java.lang.String的实例
*/
@得到
@路径(“getAVendor/{vendorno}”)
@生成(“应用程序/json”)
公共VendorEJBDTO getAVendor(@PathParam(“vendorno”)int vendorno)
{
返回vendorFacadeBean.getVendorInfo(vendorno);
}
/**
*检索resources.VendorsResource实例的表示形式
*@返回java.lang.String的实例
*/
@得到
@路径(“getVendornos”)
@生成(“应用程序/json”)
公共列表getVendornos()
{
列表vendornosList=null;
尝试
{
vendornosList=vendorFacadeBean.getvendornos();
}
捕获(例外e)
{
System.out.println(e.getMessage());
}
返回供应商列表;
}
}
您从第二种方法返回的列表似乎存在问题
您是否看到如下错误
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.ArrayList, and Java type class java.util.ArrayList, and MIME media type application/xml was not found
请参阅。此外,这似乎是不可能的。使用genson()jar并将其添加到类路径中。这将把任何对象转换为json格式。出现此错误是因为您没有json提供程序。返回object比返回toString()更好
您还可以使用jersey捆绑包附带的JAXB jar。这将同时支持XML和JSON。您可以在jersey发行版的/ext文件夹中找到jar 我通过添加以下依赖项解决了这个问题
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.17</version>
</dependency>
org.glassfish.jersey.media
泽西媒体公司
2.17
我使用的是jersey-spring3、jersey 2和spring4我将方法返回类型更新为String,并将vendorFacadeBean.getvendornos()转换为String();我将更新我的回答,因为他特别询问Glassfish,它是一个完整的JavaEE容器。
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.17</version>
</dependency>