簡體   English   中英

引發WebApplicationException時出錯:com.sun.jersey.api.MessageException:找不到Java類java.util.HashMap的消息正文編寫器

[英]error while throwing WebApplicationException : com.sun.jersey.api.MessageException: A message body writer for Java class java.util.HashMap not found

我正在使用JERSEY 1.8。 當我的函數正常運行時,它運行正常。 但是如果發生異常,則會引發錯誤:

com.sun.jersey.api.MessageException: A message body writer for Java class java.util.HashMap, and Java type class java.util.HashMap, and MIME media type application/octet-stream was not found.

我嘗試了所有給出的解決方案,但並沒有消失。

JAVA類:

@GET
@Path("/{programId}/export")
public Response exportProgramData(@PathParam(PROGRAM_ID) String programId, @Context HttpServletRequest request) {
    ResponseBuilder respBuilder = null;
    Map<String, Object> response = new HashMap<String, Object>();
    try {

        String programResponse = programsFacade.getProgramReportAsCSV(programId, userId);
        if (programResponse != null) {
            String csvFileName = programsFacade.buildFileNameForReport(programId, userId) + CSV_EXTN;
            respBuilder = Response.ok().entity(new ByteArrayInputStream(programResponse.getBytes()));
            respBuilder.header(HTTP.CONTENT_TYPE, CONTENT_CSV_TYPE);
            respBuilder.header(CONTENT_DISPOSITION, "attachment; filename=\"" + csvFileName + "\"");
            NewCookie downloadCookie = new NewCookie("fileDownload", "true", "/", null, "no comment", 1073741823,
                    false);
            respBuilder.cookie(downloadCookie);
            logger.info(LOGGER_PREFIX + "Exported program response for program: " + programId);
        } else {
            String message = "There was an error while getting the program response.";
            logger.error(LOGGER_PREFIX + message);
            respBuilder = Response.ok().entity(message);
            respBuilder.header(HTTP.CONTENT_TYPE, MediaType.TEXT_PLAIN);
            NewCookie downloadCookie = new NewCookie("fileDownload", "false", "/", null, "no comment", 1073741823,
                    false);
            respBuilder.cookie(downloadCookie);
        }
    } catch (WorkflowManagerException wme) {
        response.put(SUCCESS, false);
        response.put(HTTP_STATUS, WfManagerUtil.getResponseErrorCode(wme).getStatusCode());
        response.put(MESSAGE, wme.getMessage());
        throw new WebApplicationException(Response.status(WfManagerUtil.getResponseErrorCode(wme)).entity(response)
                .build());
    }catch (Exception ex) {
        String message = "There was an error while getting the program response.";
        logger.error(LOGGER_PREFIX + message, ex);
        respBuilder = Response.ok().entity(message);
        respBuilder.header(HTTP.CONTENT_TYPE, MediaType.TEXT_PLAIN);
        NewCookie downloadCookie = new NewCookie("fileDownload", "false", "/", null, "no comment", 1073741823,
                false);
        respBuilder.cookie(downloadCookie);
    }
    return respBuilder.build();
}

聚甲醛

   <dependency>
       <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20080701</version>
    </dependency>

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson-provider</artifactId>
        <version>3.0.5.Final</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.4</version>
    </dependency>

    <!-- REST Dependency -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
        <!-- <scope>provided</scope> -->
    </dependency>
   n is provided by velocity dep but is not available as artifact -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
        <!-- <scope>provided</scope> -->
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.8</version>
        <!-- <scope>provided</scope> -->
    </dependency>

如果出現任何WorkflowManagerException異常,它將僅引發此錯誤。

請幫忙

嘗試給予

respBuilder = Response.ok()。entity(new String(“獲取程序響應時發生錯誤。”));

在例外情況下

假設您希望將HashMap序列化為JSON ...

如果客戶端未設置Accept: application/json標頭,則Jersey無法知道將HashMap序列化為哪種媒體類型。 因此,它默認為嘗試序列化到application/octet-stream 並且對於該媒體類型的無作家HashMap 您需要通過在響應中設置媒體類型來告訴Jersey

Response errorResponse = Response.status(..)
                                  .entity(response)
                                  .type("application/json")
                                  .build();
throw new WebApplicationException(errorResponse);

還要確保在web.xml中配置jersey-json以使用Jackson

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM