2016-03-31 2 views
0

У меня есть служба REST Java, которая предоставляет несколько CRUD-услуг клиентам (используя Grizzly и Jersey). Я искал эту проблему в течение нескольких дней, и я действительно ее не понимаю, потому что есть другой звонок, предоставляемый сервером, который почти такой же, и он работает просто отлично.500 Внутренняя ошибка сервера - Джерси (веб-служба Java)

Вот код фрагмент код сервиса, который не работает:

@Path("objets") 
public class ObjetResource { 

    @PUT 
    @Path("/{code}") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public void updateObject(
     @PathParam("code") String code, 
     final Objet updatedObject){ 

     System.out.println("UpdateObject is called!"); 

     } 
} 

Эта услуга должна быть вызвано с следующим адресом:

Вот это сервис, который работает:

@Path("domaines") 
public class DomaineResource { 

    @PUT 
    @Path("/{nom}") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public void updateDomaine(
     @PathParam("nom") String nom, 
     final Domaine updatedDomaine 
     ){ 

     System.out.println("UpdateDomaine is called!"); 

    } 
} 

Эта услуга работает при вызове со следующим URL: http://localhost:8080/webservice/domaines/newDomaine

К сожалению, я получаю «Внутренняя ошибка сервера 500» ... И, конечно, «Эта функция называется» никогда не отображается ...): Я ve попытался удалить всю функцию «updateObject», и когда я это сделаю, ошибка станет «405 Method not allowed» D :!

У вас есть идея, почему у меня возникла эта проблема?

Есть ли способ получить дополнительную информацию об ошибке, которая происходит? Это очень сложно решить мою проблему с этой небольшой информацией):

EDIT: Я пробовал несколько вещей, чтобы исправить мою проблему. Во-первых, я попытался упростить свою функцию «updateObjet». Я заметил, что-то довольно странную:

Когда я посылаю следующее: JSON

{ "code" : "codeValue" } 

«UpdateObject называется» успешно отображается. Однако если я пришлю

{ "code" : "codeValue", "type" : "platform.field" } 

Ничего не отображается.

Вот код моего класса Objet:

package classes; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 


@XmlRootElement 
public class Objet extends Model{ 

@XmlElement(name="code") 
private String code; 

@XmlElement(name="type") 
private String type; 

@XmlElement(name="parent") 
private String parent; 

@XmlElement(name="annotations") 
private String annotations; 

@XmlElement(name="ontologyuri") 
private String ontologyuri; 

@XmlElement(name="access") 
private String access; 

public Objet(){ 

} 

public Objet(String code, String type, String parent, String annotations, String ontologyuri, String access){ 
    this.code = code; 
    this.type = type; 
    this.parent = parent; 
    this.annotations = annotations; 
    this.ontologyuri = ontologyuri; 
    this.access = access; 
} 

public void setCode(String code) { 
    this.code = code; 
} 

public String getCode(){ 
    return this.code; 
} 

public String getType() { 
    return type; 
} 

public void setType(String type) { 
    this.type = type; 
} 

public String getParent() { 
    return parent; 
} 

public void setParent(String parent) { 
    this.parent = parent; 
} 

public String getAnnotations() { 
    return annotations; 
} 

public void setAnnotations(String annotations) { 
    this.annotations = annotations; 
} 

public String getOntologyuri() { 
    return ontologyuri; 
} 

public void setOntologyuri(String ontologyuri) { 
    this.ontologyuri = ontologyuri; 
} 

public String getAccess(){ 
    return access; 
} 

public void setAccess(String access) { 
    this.access = access; 
} 

public String toString(){ 
    return "Code : " + getCode() + " Type : " + getType() + " Parent : " + getParent() + " Annotations : " + getAnnotations() + " ontologyuri : " + getOntologyuri() + " access : " + getAccess(); 
} 

} 

А вот код моего класса Domaine:

package classes; 

import java.util.ArrayList; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Domaine extends Model{ 

@XmlElement(name="nom") 
private String nom; 

@XmlElement(name="adresse") 
private String adresse; 

@XmlElement(name="description") 
private String description; 

@XmlElement(name="access") 
private String access; 

@XmlElement(name="plateformes") 
private ArrayList<Plateforme> plateformes; 

public Domaine(){} 

public Domaine(String nom, String adresse, String description, String access){ 
    this.nom = nom; 
    this.adresse = adresse; 
    this.description = description; 
    this.access = access; 
} 

public Domaine(String nom, String adresse, String description, String access, ArrayList<Plateforme> plateformes){ 
    this.nom = nom; 
    this.adresse = adresse; 
    this.description = description; 
    this.access = access; 
    this.plateformes = plateformes; 
} 

public String getNom(){ 
    return this.nom; 
} 
public void setNom(String nom){ 
    this.nom = nom; 
} 

public String getAdresse(){ 
    return this.adresse; 
} 
public void setAdresse(String adresse){ 
    this.adresse = adresse; 
} 

public String getDescription(){ 
    return this.description; 
} 
public void setDescription(String desc){ 
    this.description = desc; 
} 

public String getAccess(){ 
    return this.access; 
} 
public void setAccess(String access){ 
    this.access = access; 
} 

//Manipulation des plateformes 
public ArrayList<Plateforme> getPlateformes(){ 
    return this.plateformes; 
} 

public void addPlateforme(Plateforme p){ 
    this.plateformes.add(p); 
} 

public void removePlateforme(Plateforme p){ 
    this.plateformes.remove(p); 
} 

public String toString(){ 
    return "Nom : " + getNom() + " Adresse : " + getAdresse() + " Description : " + getDescription() + " Access " + getAccess(); 
} 

} 

EDIT 2: Я продолжал пытаться понять моя ошибка и добавьте несколько вещей, которые могут вам помочь: Прежде всего, я заметил, что когда я делаю «GET» на http://localhost:8080/webservice/domaines, я получаю следующий JSON:

[{"type":"domaine","nom":"DomaineTest0","adresse":"domaine de test 0","description":"","access":"test"}, 
{"type":"domaine","nom":"DomaineTest1","adresse":"Domaine de test 1","description":""}] 

Как вы можете видеть, есть поле типа, которое не указано в моем классе Domaine. Я немного искал документацию Джерси, но на данный момент я не могу понять, откуда взялось это поле типа. Что интересного в этой информации, так это то, что класс Objet I имеет поле типа. Я думал, может быть, это поле типа, которое кажется таинственным, мешает «типу» поля моего объекта Objet?

+0

В вашем файле журнала есть что-то важное? –

+0

Пожалуйста, разместите stacktrace – gregwhitaker

+0

На моем веб-сервере нет ошибок ...): [INFO] --- exec-maven-plugin: 1.2.1: java (default-cli) @ jersey-service --- avr. 01, 2016 9:08:28 AM org.glassfish.grizzly.http.server.NetworkListener start INFOS: Начальный слушатель, связанный с [localhost: 8080] avr. 01, 2016 9:08:28 AM org.glassfish.grizzly.http.server.HttpServer start INFOS: [HttpServer] запущен. Приложение для начинающих с WADL доступно по адресу http: // localhost: 8080/webservice/application.wadl Нажмите Enter, чтобы остановить его ... –

ответ

0

Проблема решена благодаря этому сообщению: Remove "type" from JSON output jersey moxy, где обсуждается аналогичная проблема.

Я применил решение Дениса Митчелла, которое аннотирует мой класс Objet с помощью @XmlType(name="") Это было необходимо, потому что Objet является подклассом. Однако, как и Деннис, я не уверен, почему это работает.

Спасибо вам за помощь :)

0

500 Internal server error просто означает, что на сервере было выброшено исключение, и запрос не завершен, как ожидалось. Поэтому я предполагаю, что это может быть некоторое исключение указателя , и причиной может быть ваш недопустимый JSON или ваша логика кода. Я не уверен в этом.

Что вы можете сделать

  1. Put точку отладки на очень 1 строки кода в методе обслуживания, если вы не получите контроль отладки там, то вы, вероятно, следует искать свой JSON снова его не так, как он должен быть
  2. Если вы получаете контроль над отладки, то трассируйте его по строкам. Я уверен, что какое-то исключение будет поднято в какой-то строке. Если да, тогда попытайтесь выяснить, почему.

Это просто дикие догадки, которые, я думаю, могут вам помочь!

Смежные вопросы