2017-07-03 1 views
0

J'essaye de publier un fichier JSON en utilisant Postman et d'obtenir une erreur de serveur interne. Je pense que le problème est lors de l'analyse de json parce que lors de la publication, je passe un objet qui a des variables qui sont également imbriquées.Jax-Rs + Jersey @Post d'objets profondément imbriqués provoquant une erreur interne du serveur

ordre Classe:

public class Order { 

     private long order_id; 
     private long user_id; 
     private List<OrderDetails> items; 
     private Date order_date; 
     private Double total; 
     private String status; 
     ...... 
} 

OrderDetails Classe:

public class OrderDetails { 

    private Product product; 
    private Integer quantity; 
    ...... 
} 

Classe de produit:

public class Product { 

    private long prodId; 
    private String prodName; 
    private String prodDesc; 
    private float price; 
    ....... 
} 

classe OrderResource: il est même pas appel à cette méthode, je suppose parce que quand je suis passé les données sous forme de chaîne et ont changé les paramètres en chaîne, il va à l'intérieur de l'appel et l'afficher sur la console. Mais quand je change à commander à nouveau, il jette un MessageBodyWriter not found for media type=application/json, type=class java.util.HashMap, genericType=class java.util.HashMap.

@POST 
    public Response insertorder(Order order, @Context UriInfo uriInfo) throws ApplicationException { 
      if (!order.isValid()) { 
      throw new ApplicationException("Order is invalid!"); 
     } 

      System.out.println("Order details in Resource: "+order.getUser_id()); 

     Order response = new OrderDAO().InsertOrder(order); 
     String newId = String.valueOf(response.getOrder_id()); 
     URI url = uriInfo.getAbsolutePathBuilder().path(newId).build(); 

     return Response.created(url) 
        .status(Status.CREATED) 
        .entity(response) 
        .build(); 
    } 

OrderDao Classe:

public Order InsertOrder(Order order) 
{ 
    Connection connection = null; 
    PreparedStatement pstmt = null; 
    ResultSet rs = null; 
    connection = connect(); 
    double total=0; 
    for(OrderDetails od: order.getItems()) { 
     total += od.getProduct().getPrice() * od.getQuantity(); 
    } 

    Order ret = null; 

    try { 
     pstmt = connection.prepareStatement("INSERT INTO main.orders_table(\n" + 
       "   user_id, order_date, total,status)\n" + 
       " VALUES (?, ?, ?)",Statement.RETURN_GENERATED_KEYS);  
     pstmt.setLong(1, order.getUser_id()); 
     pstmt.setDate(2, (Date) order.getOrder_date()); 
     pstmt.setDouble(3,total); 
     pstmt.setString(4,"pending"); 

     int affectedRows = pstmt.executeUpdate(); 

     if (affectedRows == 0) { 
      throw new SQLException("Creating user failed, no rows affected."); 
     } 

     try (ResultSet generatedKeys = pstmt.getGeneratedKeys()) { 
      if (generatedKeys.next()) { 
       System.out.println("Inserted Order Id: "+generatedKeys.getLong(1)); 
       order.setOrder_id(generatedKeys.getLong(1)); //setting the Order ID to the inserted row Id 
      } 
      else { 
       throw new SQLException("Creating user failed, no ID obtained."); 
      } 
     } 

     ret = new Order(order.getOrder_id(),order.getUser_id(),order.getOrder_date(),order.getTotal(),order.getStatus()); 
    } 
    catch (Exception e) 
     { 
      System.out.println("Error while inserting Order:" + e); 
      e.printStackTrace(); 

     } finally { 
      close(connection, pstmt, rs); 
     } 
    return ret; 
} 

Json Chaîne passant par Postman:

{ 
     "items": [ 
      { 
       "product": { 
        "price": 2, 
        "prodDesc": "Pakistani Orange", 
        "prodId": 1002, 
        "prodName": "ORANGE" 
       }, 
       "quantity": 5 
      }, 
      { 
       "product": { 
        "price": 3, 
        "prodDesc": "Kashmir Apple", 
        "prodId": 1001, 
        "prodName": "APPLE" 
       }, 
       "quantity": 5 
      } 
     ], 
     "order_date": "2008-07-06T00:00:00+08:00", 
     "user_id": 2 
    } 

Quelqu'un peut me aider à résoudre cela. TIA

Répondre

0

Puisque vous utilisez des classes comme Response, Order, vous devez mentionner @consumes et @produces. Essayez d'utiliser la méthode Put, bien que Post fonctionne toujours ici.

Configurez également correctement le facteur, mentionnez Content-Type, Accepter comme application/json chacun.

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public Response insertorder(Order order, @Context UriInfo uriInfo) throws ApplicationException { 
     if (!order.isValid()) { 
     throw new ApplicationException("Order is invalid!"); 
    } 
.. 
}