当前位置: 首页 > 知识库问答 >
问题:

用于JAX-RS对象编组的Glassfish XML(或JSON)响应导致HTTP 500内部服务器错误

卜凯旋
2023-03-14

我试图让一个JAX RS资源返回一个带有JSON对象的响应。当我通过资源类中的println()调用显示响应属性时,我看到MediaType被正确设置为“Application/json”,有一个实体与预期类型(Salesorder)、状态(status. FOUND)的响应相关联,并且响应对象是一个外部Jaxrs响应的实例。但是不知何故,当浏览器(或泽西客户端)收到响应时,这些响应属性似乎被“替换”了,结果是一个HTTP 500内部服务器错误。我的销售订单类用@XmlRootElement注释。

我的资源如下所示:

@GET
@Path("{orderUid}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response getSalesOrder(@PathParam("orderUid") Integer orderUid) {
    Response response = null;
    System.out.println("Entering SalesOrderResource getSalesOrder()...");
    SalesOrder retrievedSalesOrder =   salesOrderService.retrieveSalesOrder(orderUid);
     System.out.println("Service called and found salesOrder Uid: " + retrievedSalesOrder.getSalesOrderUid());
    if (retrievedSalesOrder != null) {
        System.out.println("SalesOrder found with UID: " + retrievedSalesOrder.getSalesOrderUid());
        response = Response.status(Status.FOUND).entity(retrievedSalesOrder).type(MediaType.APPLICATION_JSON).build();
        // The following readEntity call results in a Javax.ejb.EJBException ???
        // SalesOrder fetched = response.readEntity(SalesOrder.class);
    } else {
        response = Response.status(Status.NOT_FOUND).header("x-reason", "Order cannot be found").build();
    }
System.out.println("Response status: " + response.getStatus());
System.out.println("Response status info: " + response.getStatusInfo());
System.out.println("Response class: " + response.getClass());
System.out.println("Response length: " + response.getLength());
System.out.println("Response media type: " + response.getMediaType());
System.out.println("Response entity: " + response.getEntity());
    return response;
}

...这在运行时会导致以下结果:

2015-04-12T18:08:21.803-0600|Info:响应状态:302 2015-04-12T18:08:21.803-0600|Info:响应状态信息:已找到2015-04-12T18:08:21.803-0600|Info:响应类:类org.glassfish.jersey.message.internal.Out边界Jaxrs响应2015-04-12T18:08:21.803-0600|Info:响应长度:-1 2015-04-12T18:08:21.803-0600|Info:响应媒体类型:应用程序/xml 2015-04-12T18:08:21.803-0600|Info:响应实体:business.salesOrderMgmt.entity.SalesOrder@5e49cadd

SalesOrder实体定义为:

@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@JsonIgnoreProperties({"subTotal", "userAccount"})
@Table(name="sales_order")
@NamedQuery(name="SalesOrder.findAll", query="SELECT s FROM SalesOrder s")
public class SalesOrder implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="SALES_ORDER_UID")
private int salesOrderUid;

@Column(name="ORDER_NUMBER")
private String orderNumber;

@Column(name="BILL_TO_CITY")
private String billToCity;

@Column(name="BILL_TO_FIRST_NAME")
private String billToFirstName;

@Column(name="BILL_TO_LAST_NAME")
private String billToLastName;

@Column(name="BILL_TO_STATE")
private String billToState;

@Column(name="BILL_TO_STREET_NAME")
private String billToStreetName;

@Column(name="BILL_TO_STREET_NUMBER")
private String billToStreetNumber;

@Column(name="BILL_TO_UNIT_NUMBER")
private String billToUnitNumber;

@Column(name="BILL_TO_ZIP_CODE")
private int billToZipCode;

@Column(name="CREDIT_CARD_CSV")
private int creditCardCsv;

@Temporal(TemporalType.TIMESTAMP)
@Column(name="CREDIT_CARD_EXPIRATION_DATE")
private Date creditCardExpirationDate;

@Column(name="CREDIT_CARD_NUMBER")
private String creditCardNumber;

@Column(name="CREDIT_CARD_TYPE")
private String creditCardType;

@Column(name="EMAIL_ADDRESS")
private String emailAddress;

@Column(name="NAME_ON_CREDIT_CARD")
private String nameOnCreditCard;

@Temporal(TemporalType.TIMESTAMP)
@Column(name="SALES_ORDER_DATE")
private Date salesOrderDate;

@Column(name="SALES_ORDER_STATUS")
private String salesOrderStatus;

@Column(name="SHIP_TO_CITY")
private String shipToCity;

@Column(name="SHIP_TO_STATE")
private String shipToState;

@Column(name="SHIP_TO_STREET_NAME")
private String shipToStreetName;

@Column(name="SHIP_TO_STREET_NUMBER")
private String shipToStreetNumber;

@Column(name="SHIP_TO_UNIT_NUMBER")
private String shipToUnitNumber;

@Column(name="SHIP_TO_ZIP_CODE")
private int shipToZipCode;

@Column(name="PROMO_CODE")
private String promoCode;

//Calculated and persisted for data retrieval performance
@Column(name="SUB_TOTAL")
private BigDecimal subTotal;

@Column(name="DISCOUNT")
private BigDecimal discount;

@Column(name="SALES_TAX")
private BigDecimal salesTax;

@Column(name="SHIPPING")
private BigDecimal shipping;

@Column(name="TOTAL")
private BigDecimal total;

@Version
@Column(name="LAST_UPDATED_TIME")
private Timestamp lastUpdatedTime;

//bi-directional many-to-one association to UserAccount
@ManyToOne
@JoinColumn(name="USER_ACCOUNT_UID")
private UserAccount userAccount;

@OneToMany(targetEntity=SalesOrderLine.class, html" target="_blank">mappedBy = "salesOrder", cascade = CascadeType.ALL)
private List<SalesOrderLine> lineItems;

public SalesOrder() {
}

... getter和setter

我的POM中的依赖项包括:

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-jaxb-annotations</artifactId>
        <version>2.5.2</version>
    </dependency>

不仅请求(http://localhost:8080/[myapp]/资源/SalesOrders/13)会导致HTTP 500内部服务器错误,而且当我尝试在资源中调用response.read实体(SalesOrder.class)时,Glassfish服务器日志会显示javax.ejb.EJBException警告,该警告由java.lang.IllegalStateException:方法不支持在org.glassfish.jersey.message.internal.的出站消息中的输出JaxrsResponse.read实体(输出JaxrsResponse.java:145)。

我认为Salesorder对象的JAXB编组有问题,但我无法确定根本原因。如果我只是尝试以下操作,我仍然会收到HTTP 500内部服务器错误,表明既没有进行XML也没有进行JSON编组,但我认为这是内置在最新版本中的(Glassfish 4、JAX-RS 2)?

有什么想法吗?

共有2个答案

江子石
2023-03-14

我也有类似的问题。当然,请检查您的日志是否显示以下内容:

SEVERE:未为媒体类型=Application/json、类型=类Salesorder、泛型=类Salesorder找到MessageBodyWriter。

如果是这样,问题是您没有注册Jackson(或其他JSON编写器提供程序)。有关说明,请参阅泽西留档的这一部分:

https://jersey.java.net/documentation/latest/media.html#d0e7857

就我而言,我选择了杰克逊。我在pom中添加了以下内容。xml。

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.5.2</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.5.2</version>
</dependency>
<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.17</version>
</dependency>

然后我必须注册提供商:

public class Application extends ResourceConfig {
    public Application() {
        packages(<your ws package>);
        register(JacksonFeature.class);
    }
}
羊舌新荣
2023-03-14

我弄清楚了问题,为了其他人的利益,我将它发布在这里。1)我在资源方法中添加了以下内容:@消费(媒体类型。TEXT_PLAIN)2)步骤#1在运行时导致以下错误:在对象图中检测到一个循环。这将导致无限深的XML 3)该错误导致我将@Xml瞬变添加到OneTo多国、ManyTo多国和ManyToOne中与其他实体相关的所有实体字段中。

现在,我能够以XML和JSON返回响应。

 类似资料:
  • 我在尝试进行返回JSON的ajax POST调用时出现内部错误。ajax调用来自JS页面: 这是我的Spring MVC调用方法: 问题是,我在这个类中只设置了几个字段(30个字段中有17个)。这是一个具有简单setter-getter的bean类。如果我设置了所有30个字段,效果很好。你能建议如何设置JSON响应,以便我可以纠正这个问题吗。

  • 我的网络服务有一些问题,我试图从网络服务接收我的电影列表,但总有这个严重的错误。 这是我的模型: 还有一把刀和一个门面,但它们工作得很好! 以下是我的服务: 方法“onemovie”和“count”运行良好,我将在浏览器中显示xml,但当我调用“XMLForApp”时,服务器抛出异常。 我的客户在这里: 例外情况是:

  • 我正在学习JAX-RS,在发出生成JSON的GET请求时,出现HTTP Status 500内部服务器错误。XML工作正常。 我搜索了其他问题,但找不到解决方案。这可能是因为我目前缺乏知识。然而,据我所知,有人建议我的项目在构建路径中缺少一个JAR。 我没有使用Maven。我刚刚在Eclipse中创建了一个动态Web应用程序,并将JAX-RS/jerjar添加到我的WEB-INF/lib目录中,并

  • 问题内容: 我正在编写一个使用Json API的库,并且在使用Gson作为解析库时遇到了设计问题。 如果一切顺利,则端点之一将返回对象: 但是,API中所有端点的错误模式都是json 而不是数组。 在POJO中对此建模时会出现问题。因为错误模式对于所有API端点都是通用的,所以我决定有一个仅映射errors属性的抽象类。 现在,我想继承自此,以获取“免费”错误映射和每个API端点响应的POJO。但

  • 泽西-客户端 泽西-普通 jersey-container-servlet jersey-container-servlet-core 泽西-服务器 如果我这样做,我总是得到以下异常: 经过一些研究,我发现我应该添加jersey-servlet-1.12.jar,而不是从上面发布的下载源添加jar。所以我做了。我将其添加到web.xml中

  • 我使用Glassfish、EclipseLink和JAX-RS提供REST服务,该服务通过AngularJS/AJAX从网站调用。我返回一个类型为SalesOrder的JSON对象,该对象具有一个类型为List的名为lineItems的属性 我已经成功地调用了REST资源,并返回了一个表示父对象的JSON对象,但是,即使服务器端日志表明响应对象具有带有(2)对象的实体,客户端/浏览器端的JSON对