我想获得JSON异常而不是505默认异常

时间:2016-06-01 18:28:34

标签: java rest tomcat8 postman

我在java 8中创建messenger应用程序并使用REST。 我在我的应用中添加了关闭消息。

我希望将JSON响应作为用户定义的异常而不是apache tomcat抛出的默认异常。

例如,我的地图中有两条消息,ID = 1和2。 如果我尝试通过提供messageid 67来获取消息,它应该抛出异常。

它是由apache tomcat以HTML格式抛出异常,这不是我的要求,而是我想要JSON格式的用户定义异常。

我收到了我定义的自定义消息,但没有以JSON格式定义。

我正在使用Postman。

这是我的代码。

MessageService.java

package com.diwakar.messenger.service;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import com.diwakar.messenger.database.DatabaseClass;
import com.diwakar.messenger.exception.DataNotFoundException;
import com.diwakar.messenger.model.Message;

public class MessageService {

    private Map<Long, Message> messages = DatabaseClass.getMessages();

    public MessageService() {
        messages.put(1L, new Message(1L, "Hello World!", "Diwakar"));
        messages.put(2L, new Message(2L, "Hello Jersey!", "Diwakar"));
    }

    public List<Message> getAllMessages() {
        return new ArrayList<Message>(messages.values());
    }

    public List<Message> getAllMessagesForYear(int year) {
        List<Message> messagesForYear = new ArrayList<>();
        Calendar cal = Calendar.getInstance();
        for (Message message : messages.values()) {
            cal.setTime(message.getCreated());
            if (cal.get(Calendar.YEAR) == year) {
                messagesForYear.add(message);
            }
        }
        return messagesForYear;
    }


    public List<Message> getAllMessagesPaginated(int start, int size) {
        List<Message> list = new ArrayList<Message>(messages.values());
        if (start + size > list.size()){
            return new ArrayList<Message>();
        }
        return list.subList(start, start + size);
    }


    public Message getMessage(long id) {
        Message message =  messages.get(id);
        if (message == null) {
            throw new DataNotFoundException("Message with id : " + id + " not found. ");
        }
        return message;
    }

    public Message addMessage(Message message) {
        message.setId(messages.size() + 1);
        messages.put(message.getId(), message);
        return message;
    }

    public Message updateMessage(Message message) {
        if (message.getId() <= 0) {
            return null;
        }else {
            messages.put(message.getId(), message);
            return message;
        }
    }

    public Message removeMessage(long id) {
        return messages.remove(id);
    }


}

DataNotFoundException.java

package com.diwakar.messenger.exception;

public class DataNotFoundException extends RuntimeException{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public DataNotFoundException(String message) {
        super(message);
    }

}

DataNotFoundExceptionMapper.java

package com.diwakar.messenger.exception;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import com.diwakar.messenger.model.ErrorMessage;

@Provider
public class DataNotFoundExceptionMapper implements ExceptionMapper<DataNotFoundException> {

    @Override
    public Response toResponse(DataNotFoundException ex) {

        ErrorMessage errorMessage = new ErrorMessage(ex.getMessage(), 404, "http://www.google.com");
        return Response.status(Status.NOT_FOUND).entity(errorMessage).build();

    }
}

ErrorMessage.java

package com.diwakar.messenger.model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class ErrorMessage {

    private String errorMessage;
    private int errorCode;
    private String documentation; 

    public ErrorMessage() {

    }

    public ErrorMessage(String errorMessage, int errorCode, String documentation){
        super();
        this.errorMessage = errorMessage;
        this.errorCode = errorCode;
        this.documentation = documentation;
    }

    public String getErrorMessage() {
        return errorMessage;
    }
    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }
    public int getErrorCode() {
        return errorCode;
    }
    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }
    public String getDocumentation() {
        return documentation;
    }
    public void setDocumentation(String documentation) {
        this.documentation = documentation;
    }



}

Messages reponse

exception thrown by apache

2 个答案:

答案 0 :(得分:0)

您必须返回有效的200响应,其中有效负载是序列化的异常数据,然后您的客户端代码需要能够区分“有效”和“有效”之间的差异。 200和一个&#39;错误&#39; 200,也许是有效载荷中的旗帜。

我不是100%使用java和tomcat但是很难抛出服务器异常通常会创建500响应,但是有问题的REST框架决定这样做,通常没有敏感的异常数据。获得控制权的唯一方法是使用自定义有效负载数据返回200响应。

还要记住,你如何做到这一点可能会将异常细节暴露给你通常不想要的客户端(javascript)。

答案 1 :(得分:0)

我得到了答案......

我们可以使用com.diwakar.messenger或(com.diwakar.messenger.resources和com.diwakar.messenger.exception),而不是使用com.diwakar.messenger.resources。

这个init-parm jersey.config.server.provider.packages所说的是Jersey应该扫描命名包中的@Path注释资源类和@Provider注释的提供者类并注册它们。

我们只列出了资源包com.diwakar.messenger.resources,但ExceptionMapper位于不同的包中。默认行为是递归扫描,也表示子包。因此,如果我们编写com.diwakar.messenger,您将同时访问资源包和例外包。或者我们可以列出两个包,用逗号或分号分隔。无论哪种方式都可行

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.diwakar.messenger</param-value> 
            <!-- <param-value>com.diwakar.messenger.resources</param-value> -->
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
</web-app>

Custom Exception thrown as JSON Response