Исключение в потоке "main" javax.ws.rs.InternalServerErrorException: HTTP 500 Erreur Interne de Servlet - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть Java-клиент для вызова веб-службы REST. Если я объявлю путь в классе Java. Все хорошо, то есть: вот так:

@Path("/aqsensor")
@Produces(MediaType.TEXT_PLAIN)

public class CUManagerSensorImp {
@GET
@Path("/getQuality")
public String getQuality() {
        String quality;
        double average = getAverage();
        if (isBetween(average, 0, 39))
            quality = "Bonne qualité de l'air";
        else if (isBetween(average, 40, 79))
            quality = "Moyenne qualité de l'air";
        else
            quality = "Mauvaise qualité de l'air";

        return quality;
    }

    private double getAverage() {
        int v = (int) (Math.random() * 125);
        return v;

    }

    private boolean isBetween(double average, int min, int max) {

        if (average >= min && average <= max)
            return true;
        else
            return false;
    }

но если я объявлю Путь в интерфейсе. вот так (код интерфейса):

@Path("/aqsensor")
@Produces(MediaType.TEXT_PLAIN)

public interface CUManagerSensor {
    @GET
    @Path("/getQuality")
    String getQuality();

и это реализация интерфейса:

public class CUManagerSensorImp implements CUManagerSensor{
@Override
public String getQuality() {
        String quality;
        double average = getAverage();
        if (isBetween(average, 0, 39))
            quality = "Bonne qualité de l'air";
        else if (isBetween(average, 40, 79))
            quality = "Moyenne qualité de l'air";
        else
            quality = "Mauvaise qualité de l'air";

        return quality;
    }

    private double getAverage() {
        int v = (int) (Math.random() * 125);
        return v;

    }

    private boolean isBetween(double average, int min, int max) {

        if (average >= min && average <= max)
            return true;
        else
            return false;
    }
}

Я получаю следующее исключение:

Exception in thread "main" javax.ws.rs.InternalServerErrorException: HTTP 500 Erreur Interne de Servlet
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1074)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:859)
    at org.glassfish.jersey.client.JerseyInvocation.lambda$invoke$1(JerseyInvocation.java:743)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:205)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:390)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:741)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:404)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:300)
    at airQUserAgent.UserImp.main(UserImp.java:25)

Где проблема, когда я добавляю интерфейс? Запрещено добавлять интерфейсы при создании остальных веб-сервисов? Или вы должны добавить некоторые инструкции в файл web.xml? И заранее спасибо

1 Ответ

0 голосов
/ 08 апреля 2019

В JSR-339 (Java API для RESTful Web Services 2.0) вы можете прочитать прямо в начале раздела 3.6 Наследование аннотаций :

Аннотации JAX-RS могут использоваться для методов и параметров методов суперкласса или реализованного интерфейса.

Таким образом, можно использовать аннотации, но только в методах и параметрах метода, а не в интерфейсесамо по себе это, скорее всего, потому что они попытаются создать экземпляр типа, который аннотирован с ним.

Таким образом, проблема в вашем случае, кажется, следующие аннотации:

@Path("/aqsensor")
@Produces(MediaType.TEXT_PLAIN)

Который должен храниться в определенном классе, а не в интерфейсе.Кроме того, спецификация в том же разделе в конце указывает:

Для согласованности с другими спецификациями Java EE рекомендуется всегда повторять аннотации, а не полагаться на наследование аннотаций.

Так что используйте наследование аннотаций на свой страх и риск.

...