POST Operation is failing with an error 405 Method not allowed

荒凉一梦 提交于 2019-12-08 03:30:30

问题


I developed a Java application using the S4SDK as described in the link below and deployed it to the SAP Cloud platform cloud foundry environment.

https://blogs.sap.com/2017/12/07/step-20-with-s4hana-cloud-sdk-create-and-deep-insert-with-the-virtual-data-model-for-odata/

Then I accessed the application using POSTMAN tool. First, I made a GET request for application URL/businesspartners and fetched x-csrf-token. I used this x-csrf-token for POST operation for application URL/businesspartners with body as explained in the blog( above link).

So, when I make a post request, it gave an error: 405 METHOD NOT ALLOWED

Below is the servlet:

@WebServlet("/businesspartners")
public class BusinessPartnerServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
private static final Logger logger = CloudLoggerFactory.getLogger(BusinessPartnerServlet.class);

private static final String CATEGORY_PERSON = "1";

@Override
protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
        throws ServletException, IOException {
    try {
        final List<BusinessPartner> businessPartners =
                new DefaultBusinessPartnerService()
                        .getAllBusinessPartner()
                        .select(BusinessPartner.BUSINESS_PARTNER,
                                BusinessPartner.LAST_NAME,
                                BusinessPartner.FIRST_NAME,
                                BusinessPartner.IS_MALE,
                                BusinessPartner.IS_FEMALE,
                                BusinessPartner.CREATION_DATE)
                        .filter(BusinessPartner.BUSINESS_PARTNER_CATEGORY.eq(CATEGORY_PERSON))
                        .orderBy(BusinessPartner.LAST_NAME, Order.ASC)
                        .execute();

        response.setContentType("application/json");
        response.getWriter().write(new Gson().toJson(businessPartners));

    } catch (final ODataException e) {
        logger.error(e.getMessage(), e);
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.getWriter().write(e.getMessage());
    }
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    final String firstname = request.getParameter("firstname");
    final String lastname = request.getParameter("lastname");
    final String country = request.getParameter("country");
    final String city = request.getParameter("city");
    final String email = request.getParameter("email");

    //do consistency checks here...

    final AddressEmailAddress emailAddress = AddressEmailAddress.builder()
            .emailAddress(email)
            .build();

    final BusinessPartnerAddress businessPartnerAddress = BusinessPartnerAddress.builder()
            .country(country)
            .cityName(city)
            .toEmailAddress(Lists.newArrayList(emailAddress))
            .build();

    final BusinessPartnerRole businessPartnerRole = BusinessPartnerRole.builder()
            .businessPartnerRole("FLCU01")
            .build();

    final BusinessPartner businessPartner = BusinessPartner.builder()
            .firstName(firstname)
            .lastName(lastname)
            .businessPartnerCategory("1")
            .correspondenceLanguage("EN")
            .toBusinessPartnerAddress(Lists.newArrayList(businessPartnerAddress))
            .toBusinessPartnerRole(Lists.newArrayList(businessPartnerRole))
            .build();

    String responseBody;

    try {
        final BusinessPartner storedBusinessPartner = new StoreBusinessPartnerCommand(new ErpConfigContext(), new DefaultBusinessPartnerService(), businessPartner).execute();
        responseBody = new Gson().toJson(storedBusinessPartner);
        response.setStatus(HttpServletResponse.SC_CREATED);

    } catch(final HystrixBadRequestException e) {
        responseBody = e.getMessage();
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        logger.error(e.getMessage(), e);
    }

    response.setContentType("application/json");
    response.getOutputStream().print(responseBody);
}
}

And here my web.xml file.

<?xml version="1.0" encoding="UTF-8"?>

<session-config>
    <session-timeout>20</session-timeout>
</session-config>

<!--
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-security.xml</param-value>
</context-param>
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
-->

<filter>
    <filter-name>RestCsrfPreventionFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>RestCsrfPreventionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>HttpSecurityHeadersFilter</filter-name>
    <filter-class>com.sap.cloud.sdk.cloudplatform.security.servlet.HttpSecurityHeadersFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HttpSecurityHeadersFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>HttpCachingHeaderFilter</filter-name>
    <filter-class>com.sap.cloud.sdk.cloudplatform.security.servlet.HttpCachingHeaderFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HttpCachingHeaderFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Could someone please help me?


回答1:


Have you checked that your servlet implements the doPost method correctly? The following question on SO seems quite good on this: Java Servlet return error 405 (Method Not Allowed) for POST request.




回答2:


Have you tried to add the @Override annotation to the doPost method?



来源:https://stackoverflow.com/questions/49858668/post-operation-is-failing-with-an-error-405-method-not-allowed

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!