500内部服务器错误 - Jersey(Java Web服务)

时间:2016-03-31 15:15:46

标签: java web-services rest jersey

我有一个Java REST服务,它为客户端提供了几种CRUD服务(使用Grizzly和Jersey)。我一直在寻找这个问题好几天了,我真的不明白,因为服务器提供的另一个电话几乎一样,而且工作得很好....

以下是不起作用的服务的代码段:

@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!");

        }
}

应该使用以下网址调用此服务:http://localhost:8080/webservice/objets/newCode

这是一项有效的服务:

@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!");

    }
}

使用以下网址调用此服务时有效:http://localhost:8080/webservice/domaines/newDomaine

可悲的是,我收到“500内部服务器错误”...当然“永远不会显示”此函数被调用...): 我已经尝试删除整个“updateObject”函数,当我这样做时,错误变为“405 Method not allowed”D:!

你知道我为什么遇到这个问题吗?

有没有办法获得有关正在发生的错误的更多信息?用这些小信息解决我的问题真的很难):

修改: 我已经尝试了几件事来纠正我的问题。 首先,我试图简化我的“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();
}

}

编辑2 : 我一直在尝试理解我的错误,并添加一些可能有用的内容: 首先,我注意到当我在http://localhost:8080/webservice/domaines上进行“GET”时,我会收到以下JSON:

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

如您所见,有一个“类型”字段,在我的Domaine类中未指定。我在Jersey的文档中搜索了一下,但目前我无法理解这个“类型”字段的来源。 这些信息的有趣之处在于我指定的Objet类具有“类型”字段。我想也许这个神秘的“类型”字段会干扰我的Objet的“类型”字段?

2 个答案:

答案 0 :(得分:0)

select t1.*, (select t2.color from table2 t2 where t1.name = t2.name and t2.min <= t1.number order by t2.min desc limit 1 ) as color from table1 t1; 只是意味着服务器中抛出了一些异常,请求未按预期完成。所以我猜它可能是一些500 Internal server error指针异常,原因可能是你的无效null或你的代码逻辑我不确定。

你可以做的事情

  1. 如果你不能在服务方法中获得调试控制,那么在服务方法的第一行放置调试点然后你应该再看看你的JSON不是应该的样子
  2. 如果您在调试中获得控制权,则逐行跟踪。我很确定某些异常会在某些方面引发异常。如果是这样,那么试着找出原因。
  3. 这些只是猜测,我认为这可能会对你有所帮助!

答案 1 :(得分:0)

由于这篇文章解决了问题:Remove "type" from JSON output jersey moxy讨论了类似的问题。

我应用了Dennis Mitchell的解决方案,该解决方案使用@XmlType(name="")注释我的类Objet。这是必要的,因为Objet是一个子类。但是,作为丹尼斯,我不确定为什么会这样。

谢谢大家的帮助:)