Frage

Ich habe mit AppFuse eine einfache Anwendungs-Shell erstellt und bin den Anweisungen gefolgt AppFuse-Tutorial um einen einfachen RESTful-Dienst mit Jax-RS zu erstellen.Das funktioniert ganz gut.Ein Aufruf an http://localhost:8080/services/api/persons gibt eine Sammlung von Person-Objekten als Json-formatierte Zeichenfolge mit den richtigen Daten zurück.

Ich möchte jetzt auf die zugreifen ServletRequest Und ServletResponse Objekte aus einem von Appfuse bereitgestellten RESTful-Dienst (um eine andere Bibliothek zu verwenden, die diese Objekte benötigt).

ICH denken das sollte machbar sein, indem man eine @Context-Annotation hinzufügt, z.B.im Anschluss daran StackOverflow-Beitrag und das Forumsbeitrag.

Wenn ich jedoch das @Context-Tag hinzufüge (siehe unten), lässt es sich gut kompilieren, löst aber beim Neustart des Servers eine Ausnahme aus (unten angehängt).

Hier ist die Erklärung des @WebService:

@WebService
@Path("/persons")
public interface PersonManager extends GenericManager<Person, Long> {
    @Path("/")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    List<Person> read();
    ...
}

Und hier ist die Implementierungsklasse, die ich meiner Meinung nach aufrufen würde @Context Anmerkung:

@Service("personManager") 
public class PersonManagerImpl extends GenericManagerImpl<Person, Long> implements PersonManager { 
    PersonDao personDao; 
    @Context ServletRequest request; // Exception thrown on launch if this is present 
    @Context ServletContext context;  // Exception thrown on launch of this is present 
    ... 
    } 

Hoffentlich fehlt mir etwas Einfaches, entweder etwas, das ich einbinden muss, damit es funktioniert, oder mir klar wird, dass es eigentlich nicht möglich sein sollte, die ServletRequest zu bekommen, weil ...Hinweise wären willkommen.

Ich führe dies auf Tomcat in IntelliJ aus.

=== AUSNAHME STACK TRACE (abgeschnitten) ===

Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are: 
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'serviceBeans' threw exception; nested exception is java.lang.RuntimeException: java.lang.NullPointerException 
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102) 
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) 
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358) 
        ... 37 more 
War es hilfreich?

Lösung

Versuchen Sie, das zu injizieren HttpServletRequest Und HttpServletContext direkt:

@Context private HttpServletRequest servletRequest;
@Context private HttpServletContext servletContext;

Andere Tipps

Das Hinzufügen zur Methodensignatur hat funktioniert.Ich kann mir vorstellen, dass das daran liegt, dass die Anforderungs- und Antwortobjekte noch nicht vorhanden sind, wenn die Klasse instanziiert wird, aber schon vorhanden sind, wenn sie vom Browser aufgerufen werden.

@Path("/")
@GET
@Produces(MediaType.APPLICATION_JSON)
List<Person> read( @Context HttpServletRequest httpServletRequest, @Context HttpServletResponse httpServletResponse) { }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top