2015-08-21 1 views
1

Я пишу остальную сервисную службу, которая имеет formParam и возвращает список. и я тестирую его в почтальоне. но я получаю эту ошибку.HTTP Status 500. Сервер обнаружил внутреннюю ошибку, которая помешала ей выполнить эту ошибку запроса. вот моя служба:успокаивающие веб-службы: HTTP-статус 500. Сервер обнаружил внутреннюю ошибку, которая помешала ему выполнить эту ошибку запроса.

@Path("/report") 
public class weightingResource { 

@POST 
@Path("/loadWeightingByPlate") 
//@Produces(MediaType.APPLICATION_XML) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public List<Weighting> LoadWeightingInSpecTimeInSpecPlate(
     @FormParam("plate") String plate, 
     @FormParam("startTime") String _startTime, 
     @FormParam("endTime") String _endTime, 
     @Context HttpServletRequest req) { 
    Long startTime = new Long(_startTime); 
    Long endTime = new Long(_endTime); 
    try { 
     List<Weighting> weightings = Weighting.LoadWeightingInSpecTimeInSpecPlate(startTime, endTime, plate); 
     System.out.println("no error"); 
     return weightings; 
    } catch (Exception ex) { 
     System.out.println("Exception = " + ex); 
     return null; 
    } 
} 
} 

тест я Weighting.LoadWeightingInSpecTimeInSpecPlate(startTime, endTime, plate) и эта работа правильно. Может ли кто-нибудь мне помочь?

трассировки стека:

Blockquote21-августа-2015 17: 44: 31,133 ПРЕДУПРЕЖДЕНИЕ [HTTP-NiO-8084-Exec-197] org.glassfish.jersey.servlet.WebComponent.filterFormParameters запрос сервлету URI http://127.0.0.1:8084/fsc-access/rest/report/loadWeightingByPlate содержит параметры формы в теле запроса, но тело запроса потребляется сервлетом или фильтром сервлета, обращаясь к параметрам запроса. Только методы ресурсов, использующие @FormParam, будут работать как ожидалось. Методы ресурсов, потребляющие тело запроса другими способами, не будут работать должным образом. 21-Aug-2015 17: 44: 31.210 SEVERE [http-nio-8084-exec-197] org.glassfish.jersey.message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter не найден для типа media = application/xml, type = class java.util.ArrayList, genericType = java.util.List.

теперь моя служба работает хорошо и я пишу клиент, чтобы использовать эту услугу, но я получаю сообщение об ошибке: HTTP 400 Bad Request: javax.ws.rs.BadRequestException

 String webserviceURI = "http://localhost:8084/fsc-access"; 

    ClientConfig clientConfig = new ClientConfig(); 
    Client client = ClientBuilder.newClient(clientConfig); 
    URI serviceURI = UriBuilder.fromUri(webserviceURI).build(); 
    WebTarget webTarget = client.target(serviceURI); 
    MultivaluedMap formData = new MultivaluedMapImpl(); 
    formData.add("plate", plate); 
    formData.add("startTime", start.toString()); 
    formData.add("endTime", end.toString()); 
    Weightings weightings = new Weightings(); 
    weightings.getWeightings().addAll((Collection<? extends Weighting>) webTarget.path("rest").path("report").path("loadWeightingByPlate"). 
      request().accept(MediaType.APPLICATION_XML).post(javax.ws.rs.client.Entity.form(formData), Weightings.class)); 

как я могу исправить Это ?

+1

Если есть ответ 500, это обычно означает, что в ваших журналах будет трассировка стека. Пожалуйста, разместите здесь трассировку стека, чтобы мы могли лучше вам помочь. – Samuel

+0

Да, есть кое-что: я поставил предупреждение в вопрос –

ответ

1

Во-первых, причина, вы получаете 500 рассказана следующее сообщение:

21-августа-2015 17: 44: 31,210 ТЯЖЕЛАЯ [HTTP-NiO-8084-Exec-197] org.glassfish.jersey.message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter не найден для типа media = application/xml, type = class java.util.ArrayList, genericType = java.util.List.

Это указывает на то, что Джерси, ваш сервлет, не зарегистрированной MessageBodyWriter, который возвращает true из isWritable() со следующими параметрами

media type=application/xml, 
type=class java.util.ArrayList, 
genericType=java.util.List 

AFAIK Джерси обычно имеет доступ к реализации JAXB, но некоторые реализации JAXB не может обрабатывать дженерики как List правильно. Я бы предположил, что вы создаете новый класс под названием Weightings, который является оболочкой списка для коллекции объектов Weighting. Это обычное дело с моделями JAXB.

@XmlRootElement 
public class Weightings { 
    @XmlElement 
    private final List<Weighting> weightings = new ArrayList<Weighting>(); 

    public List<Weighting> getWeightings() { 
     return weightings; 
    } 
} 

Затем измените свой ресурс, чтобы вернуть новый тип:

@POST 
@Path("/loadWeightingByPlate") 
@Produces(MediaType.APPLICATION_XML) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public Weightings LoadWeightingInSpecTimeInSpecPlate(
     @FormParam("plate") String plate, 
     @FormParam("startTime") String _startTime, 
     @FormParam("endTime") String _endTime, 
     @Context HttpServletRequest req) { 
    Long startTime = new Long(_startTime); 
    Long endTime = new Long(_endTime); 
    try { 
     Weightings weightings = new Weightings(); 
     weightings.getWeightings().addAll(Weighting.LoadWeightingInSpecTimeInSpecPlate(startTime, endTime, plate)); 
     System.out.println("no error"); 
     return weightings; 
    } catch (Exception ex) { 
     System.out.println("Exception = " + ex); 
     return null; 
    } 
} 

Это должно исправить вашу 500 ответ. Другой вариант - осмотреться и протестировать другие реализации JAXB или application/xmlMessageBodyWriter, которые могут лучше поддерживать дженерики.

Другой предупреждение вы получаете:

21-Aug-2015 17: 44: 31.133 ПРЕДУПРЕЖДЕНИЕ [HTTP-NiO-8084-EXEC-197] org.glassfish.jersey.servlet.WebComponent .filterFormParameters запрос сервлета к URI http://127.0.0.1:8084/fsc-access/rest/report/loadWeightingByPlate содержит параметры формы в теле запроса, но тело запроса было потреблено сервлет или сервлет фильтром, осуществляющий доступом к просьбе об параметрах. Только методы ресурсов, использующие @FormParam, будут работать как ожидаемые . Методы ресурсов, потребляющие тело запроса другими средствами , не будут работать должным образом.

Я хотел бы посмотреть на this question, если вы заинтересованы в фиксации предупреждения.

+0

спасибо, Самуэль, это хорошо работает. теперь я пишу клиент для использования этой службы. но когда я его использую, я получаю HTTP 400 Bad Request: javax.ws.rs.BadRequestException. Я поставил свой клиентский источник в свой вопрос. можешь мне помочь ? –

+0

Fatemeh, вы должны открыть новый вопрос для своего нового вопроса, чтобы он стал больше внимания и с большей вероятностью получится ответить – Samuel

+0

ok, Samuel. Я создаю новый вопрос в: http://stackoverflow.com/questions/32147028/http-400-bad-request-javax-ws-rs-badrequestexception –

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

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