【问题标题】:Java controller giving 404 error on live serverJava 控制器在实时服务器上给出 404 错误
【发布时间】:2019-04-01 05:25:23
【问题描述】:

我正在服务器上设置我的 java web 应用程序,但其余控制器给出 404 错误。

在我的本地系统上一切正常。

这是我在 java hibernate spring 中的第一个项目。

下面是我的代码:

UserLoginController.java

package org.jasyatra.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.jasyatra.model.User;
import org.jasyatra.model.LoginAuthToken;
import org.jasyatra.service.UserLoginService;
import org.jasyatra.service.LoginAuthTokenService;

@RestController
public class UserLoginController {

    @Autowired
    UserLoginService userLoginService;

    @Autowired
    LoginAuthTokenService loginAuthTokenService;

    @RequestMapping(value = "/user/login", method = RequestMethod.POST, headers = "Accept=application/json")
    public Map login(@RequestBody User parameters) {
        List<User> loginResponse = userLoginService.login(parameters);

        Map<String, String> response = new HashMap<>();

        if (loginResponse.size() > 0) {
            response.put("result", "true");
            response.put("id", Integer.toString(loginResponse.get(0).getId()));
            response.put("type", loginResponse.get(0).getType());
            response.put("firstName", loginResponse.get(0).getFirstName());
            response.put("lastName", loginResponse.get(0).getLastName());
            response.put("permissions", loginResponse.get(0).getPermissions());
            List<LoginAuthToken> responseToken = loginAuthTokenService.getLatestToken(loginResponse.get(0).getId(),loginResponse.get(0).getType());
            response.put("token", responseToken.get(0).getToken());
        } else {
            response.put("result", "false");
            response.put("message", "Invalid mobile no or password!");
        }

        return response;
    }
}

UserLoginDAO.java

package org.jasyatra.dao;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.jasyatra.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.jasyatra.service.HashService;

@Repository
public class UserLoginDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public List<User> login(User parameters) {
        Session session = this.sessionFactory.getCurrentSession();

        Query query = session.createQuery("from User where mobileNo=:mobileNo and password=:password and status=:status");
        query.setParameter("mobileNo", parameters.getMobileNo());
        query.setParameter("password", HashService.getHash(parameters.getPassword(), "SHA1"));
        query.setParameter("status", "active");
        List<User> response = query.list();
        return response;
    }
}

UserLoginService.java

package org.jasyatra.service;

import java.nio.charset.Charset;
import java.util.Date;
import java.util.List;
import java.util.Random;
import org.jasyatra.dao.UserLoginDAO;
import org.jasyatra.dao.LoginAuthTokenDAO;
import org.jasyatra.model.LoginAuthToken;
import org.jasyatra.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserLoginService {

    @Autowired
    UserLoginDAO userLoginDao;

    @Autowired
    LoginAuthTokenDAO loginAuthTokenDAO;

    @Autowired
    LoginAuthTokenService loginAuthTokenService;

    @Transactional
    public List<User> login(User parameters) {

        List<User> login = userLoginDao.login(parameters);
        LoginAuthToken loginAuthToken = new LoginAuthToken();
        if (login.size() > 0 && login.get(0).getId() > 0) {
            try {

                loginAuthToken.setLoginId(login.get(0).getId());
                loginAuthToken.setLoginType(login.get(0).getType());

                byte[] array = new byte[7]; // length is bounded by 7
                new Random().nextBytes(array);
                String generatedString = new String(array, Charset.forName("UTF-8"));

                String token = HashService.getHash(generatedString, "SHA1");
                loginAuthToken.setDateCreated(new Date());
                loginAuthToken.setToken(token);
                loginAuthTokenService.save(loginAuthToken);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return login;
    }
}

context.xml

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

spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
             xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <annotation-driven />

    <resources mapping="/resources/**" location="/resources/" />

    <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <beans:property name="url" value="jdbc:mysql://localhost:3306/jasyatra" />
        <beans:property name="username" value="root" />
        <beans:property name="password" value="" />
    </beans:bean>

    <!-- Hibernate 4 SessionFactory Bean definition -->
    <beans:bean id="hibernate4AnnotatedSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <beans:property name="dataSource" ref="dataSource" />
        <beans:property name="annotatedClasses">
            <beans:list>
                <beans:value>org.jasyatra.model.User</beans:value>
            </beans:list>
        </beans:property>
        <beans:property name="hibernateProperties">
            <beans:props>
                <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop>
                <beans:prop key="hibernate.show_sql">true</beans:prop>
            </beans:props>
        </beans:property>
    </beans:bean>
    <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="maxUploadSize" value="268435456"/>
    </beans:bean>
    <context:component-scan base-package="org.jasyatra" />

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
    </beans:bean>
</beans:beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>Archetype Created Web Application</display-name>
    <servlet>
 <servlet-name>spring</servlet-name>
 <servlet-class>
  org.springframework.web.servlet.DispatcherServlet
 </servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
 <servlet-name>spring</servlet-name>
 <url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

我遇到的主要问题是,它能够运行 index.jsp 但不能运行控制器。可能是什么问题?

请指引我正确的方向。

谢谢

【问题讨论】:

  • 请添加来自服务器的日志跟踪。另外,你说它在本地工作,但它不工作在哪里??
  • 许多 cmets:(1) 使用 JPA(带有 Hibernate)而不是传统的 Hibernate 接口。 (2) 使用 Spring Data 而不是手写 DAO。 (3) 使用 Spring Security 代替手写安全敏感代码。 (4) 使用 Spring Boot 而不是你的配置(你唯一需要的是spring.datasource.url)和你的servlet映射(只是java -jar)。 (5) 使用构造函数注入代替字段注入。 (6) 使用正确的 HTTP 响应(例如 422)而不是 success: false。
  • 404 表示,找不到资源。 POST 请求是如何发出的?请分享用于访问服务器的 URL
  • @chrylis 我知道我的代码不是最好的,因为这是我的第一个项目。我仍处于学习阶段,但由于这是实时项目,我需要让它在服务器上运行。我如何找出我做错了什么让它给我 404 ?
  • @RanjitGopinathan api.jasyatra.com/user/login

标签: java hibernate spring-boot


【解决方案1】:

您无法在浏览器中打开该 url,因为它是 POST 服务,您只能在浏览器中打开 GET url。您需要在点击该网址时添加一个正文进行测试 您可以使用邮递员的服务。

【讨论】:

  • 我没有更新代码中的任何内容,我只是使用 post 方法通过邮递员运行了 url
  • 你可以点击上下文路径,而不是点击你的网址,让我知道你在那里看到了什么?
  • 怎么做?
【解决方案2】:
    no need to send "Accept" header this way, you can use however following attribute instead if you expect a json body with the post request :

    @RequestMapping(value = "/user/login", method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE);

if you want to get "Accept" header value of your request you can get it like : 
    public Map login(@RequestBody User parameters,@RequestHeader(value="Accept") String accept){  
    ....

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2022-01-16
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多