Jersey 2.10.4 mit jackson führt PUSH und PUT nicht aus

Hallo liebe Forengemeinde,

ich hänge hier schon seit 2 Tagen an einem Problem, dessen Ursache für mich im Dunklen liegt.

Ich versuche einen REST-Service mit Glassfish 4.1 und Jersey 2.10.4 mit Jackson als JSON-Mapper zu bauen, dieser jedoch lässt nur GET und DELETE-Anfragen zu, POST und PUT wird mit 400 - Bad Request ohne irgendwelche Loggings im Server-Log zurückgewiesen und die entsprechend annotierten Methoden werden garnicht erst ausgeführt.
Es läuft auch ein CrossOriginFilter extends ContainerResponseFilter bei jeder GET und DELETE-Anfrage, bei PUT und PUSH wird dieser jedoch nicht ausgeführt.

Ich habe folgende Maven-Konfiguration:
[XML]
javax.ws.rs
javax.ws.rs-api
2.0.1
provided


org.glassfish.jersey.media
jersey-media-json-jackson
2.10.4


javax
javaee-web-api
7.0
provided
[/XML]

Außerdem sieht meine web.xml folgendermaßen aus:
[XML]

BASIC
MyAuthRealm


secure

secure

/*
GET
PUT
POST
DELETE



USER_ROLE
ADMINISTRATOR_ROLE
EDITOR_ROLE
DELETE_ROLE




ADMINISTRATOR_ROLE



USER_ROLE



EDITOR_ROLE



DELETE_ROLE

[/XML]

Mit der Konfiguration der gesamten Security-Einstellungen befasse ich mich später, da meine EJB (in einer anderen .jar-Datei) mit @RolesAllowed-Annotationen arbeiten und ich ohne diese web.xml immer eine EJBAccesException bekomme (auch wenn der Client sich authentifiziert.

Ich habe außerdem noch folgende ApplicationConfig-Klasse:

public class ApplicationConfig extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new HashSet<>();

        resources.add(my.package.CrossOriginFilter.class);
        resources.add(JacksonFeature.class);
        resources.add(LoggingFilter.class);
        addRestResourceClasses(resources);

        return resources;
    }
    private void addRestResourceClasses(Set<Class<?>> resources) {
        //Alle ExceptionMapper und REST-Klassen werden hinzugefuegt
    }
}```

Soviel zur Grundstruktur, jetzt meine REST-Klasse, die wie alle anderen meiner REST-Klassen (alle ähnlich aufgebaut), alle GET und DELETE-Operationen ausführt, jedoch alle Methoden, die mit @Post oder @Put annotiert sind, gar nicht ausführt, also ignoriert):
Hinweis: Die Vater-Klasse AbstractFacade ist zur Zeit noch funktionslos!
```//Workaround for Bug https://java.net/jira/browse/GLASSFISH-21114
@RequestScoped
@Path("town/")
public class TownFacadeREST extends AbstractFacade<Town> implements Serializable {
    //Variablen und Konstruktor

    @POST
    @Consumes({"application/xml"})
    public void create(TownTO entity) throws FMBusinessException {
        //Wird garnicht erst ausgeführt!
    }

    @PUT
    @Path("{id}")
    @Consumes({"application/json"})
    @Produces({"application/json"})
    public TownTO edit(@PathParam("id") Long id, TownTO entity) throws FMBusinessException {
        //Wird garnicht erst ausgeführt!
    }

    @DELETE
    @Path("{id}")
    public void remove(@PathParam("id") Long id) throws FMBusinessException {
        //Löschen funktioniert problemlos
    }

    @GET
    @Path("{id}")
    @Produces({"application/json"})
    public TownTO find(@PathParam("id") Long id) throws FMEntityNotFoundException {
        //Finden funktioniert problemlos
    }

    @GET
    @Produces({"application/json"})
    public List<TownTO> findAll() throws FMBusinessException {
        //Alle finden funktioniert problemlos
    }
}```
```@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class TownTO implements Serializable {
    private Long   id;
    private String name;
    private String postalCode;

    public TownTO() {
        System.out.println("TownTO creation");
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getPostalCode() {
        return postalCode;
    }
}```

Ich hoffe, ich habe alle Informationen mit reingepackt und hoffe außerdem, dass mir jemand hierbei aushelfen kann, denn ich bin wirklich mit allem am Ende (verschiedene web.xml-Konfigurationen durchgegangen, usw.)
Schönen Gruß,
Philipp

Haben die PUT/POST Anfragen einen Content-Type application/json?

Warum verlangt der POST application/xml?

Sprich: wie werden die Anfragen erzeugt?

Hi, sorry für die späte Antwort, bin in einer anderen Zeitzone :slight_smile:

Sorry, zur Anfrage habe ich gar nichts geschrieben (teste mit Advanced Rest Client für Google Chrome):

Status 400 Bad Request Loading time: 21 ms

Request headers
Accept: application/json
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Content-Type: application/json
DNT: 1
Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4

Request Payload POST
{„name“:„Teststadt“,„postalCode“:„12345“}

bzw. für PUT
{„id“:1,„name“:„Teststadt“,„postalCode“:„12345“}

Response headers
Content-Encoding: gzip
Server: GlassFish Server Open Source Edition 4.1
X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition 4.1 Java/Oracle Corporation/1.7)
Content-Type: text/html;charset=ISO-8859-1
Date: Mon, 15 Dec 2014 18:14:00 GMT
Connection: close
Transfer-Encoding: chunked

Ich habe außerdem noch vergessen, dass wenn ich eine GET-Anfrage schicke und einen org.glassfish.jersey.filter.LoggingFilter aktiviert habe, bekomme ich die Anfrage im Server-Log angezeigt, bei POST und PUT wie gesagt garnichts.

Sorry, das war ein Copy-Paste-Fehler hierher, da ich zuvor getestet habe, ob es vlt. irgendwie mit JSON zusammen hängt.

Vielen Dank schon mal für deine Antwort
P.s.: Wie ich auf PUSH statt POST gekommen bin, weiß ich gerade auch nicht, meine natürlich überall statt PUSH POST

Stimmen die Aufrufparameter?

post: public void create(TownTO entity) throws
aber in deiner Anfrage:
Request Payload POST
{“name”:“Teststadt”,“postalCode”:“12345”}

put: public TownTO edit(@PathParam(“id”) Long id, TownTO entity) throws
aber in deiner Anfrage:
bzw. für PUT
{“id”:1,“name”:“Teststadt”,“postalCode”:“12345”}

Meinst du, dass bei PUT die ID mitgesendet wird und bei POST nicht? Wenn ja, vor dem POST habe ich noch keine ID, da diese erst beim Erstellen generiert wird.
Oder meinst du was ganz anderes?

sorry, scheint zu passen…

stimmt eigentlich der void-Typ? sollte da nicht Response stehen?

andererseits: irgendwas MUSS doch in den Logfiles-stehen? Request ist ja Request, wirf mal einfach mit throw eine Exception in der PUT/POST Methode (oder logge irgendwas) um zu sehen, ob die überhaupt ausgeführt wird

Es funktioniert jetzt, habe die aktuellste GlassFish 4.1 Build 13-Version heruntergeladen und komplett neu aufgesetzt (vorher hatte ich allerdings auch Build 13). Sonst habe ich nichts geändert.
Ich kann mir wirklich nicht erklären, woran das gelegen hat (zumal es wirklich keine einzigen Log-Einträge gab und die Methoden tatsächlich nicht aufgerufen wurden).

Bleiglanz, dir danke ich trotzdem für deine Bemühungen, vielen Dank!