Parrilla de primavera: Retorno del programa en clase Java pero no en PHPMyadmin

Esta es mi primera vez haciendo un bot de Discord que se adjunta a un DB con bota de primavera y Gradle. Seguí algunos tutoriales y el bot de Discord funciona correctamente pero cuando quiero llamar a mi DB vuelve nulo en mi Java. Traté de usar la misma consulta en mi PHPmyadmin para ver si es realmente un nulo pero en realidad, debería haber devuelto un valor.

Esta es mi clase principal

@SpringBootApplication
public class Main {

    private static Logger logger = LogManager.getLogger(Main.class);

    /**
     * The entrance point of our program.
     *
     * @param args The arguments for the program. The first element should be the bot's token.
     */

    public static void main(String[] args) {
//        if (args.length < 1) {
//            System.err.println("Please provide a valid token as the first argument!");
//            return;
//        }

        SpringApplication.run(Main.class, args);

        // Enable debugging, if no slf4j logger was found
        FallbackLoggerConfiguration.setDebug(true);

        // The token is the first argument of the program
        String token = "Nzg3NTI4MTU0MDM3MjIzNDU2.X9WQvw.Ix9zeiZB5KWwGkxfUAU0pjy4xF0";

        // We login blocking, just because it is simpler and doesn't matter here
        DiscordApi api = new DiscordApiBuilder().setToken(token).login().join();

        // Print the invite url of the bot
        logger.info("You can invite me by using the following url: " + api.createBotInvite());

    

        // Add listeners
        api.addMessageCreateListener(new CommandManager("!")); // <-- I want to run this command

        // Log a message, if the bot joined or left a server
        api.addServerJoinListener(event -> logger.info("Joined server " + event.getServer().getName()));
        api.addServerLeaveListener(event -> logger.info("Left server " + event.getServer().getName()));
    }

}

Desde allí, debería llevarme a mi Comandante. java dentro de mi directorio de comandos

public class CommandManager implements MessageCreateListener {
    String prefix="!";
    DieCommand dieCommand = new DieCommand();
    EightBallCommand eightBallCommand = new EightBallCommand();
    UserInfoCommand userInfoCommand = new UserInfoCommand();
    NijiMemberCommand nijiMemberCommand = new NijiMemberCommand();
    CurrencyConverterCommand currencyConverterCommand = new CurrencyConverterCommand();

    public CommandManager(String pfx) {
        this.prefix = pfx;
    }


    @Override
    public void onMessageCreate(MessageCreateEvent event) throws NullPointerException {
        String[] command = event.getMessageContent().split(" ");
        if(command[0].contains(prefix+"roll")){
            dieCommand.onMessageCreate(event);
            return;
        }
        if(command[0].contains(prefix+"8ball")){
            eightBallCommand.onMessageCreate(event);
            return;
        }
        if(command[0].contains(prefix+"userinfo")){
            userInfoCommand.onMessageCreate(event);
            return;
        }

        if(command[0].contains(prefix+"whois")){ 
            nijiMemberCommand.onMessageCreate(event);
            return;
        }
        if(command[0].contains(prefix+"convert")){
            currencyConverterCommand.onMessageCreate(event);
            return;
        }

    }
}

Para esta clase, tengo un administrador de configuración.

@Configuration
public class ConfigurationManager {
    @Bean
    public CommandManager commandManager() {
        return new CommandManager("!");
    }
}

El comando que quiero probar es ! whois noraneko que me llevará a NijiMemberCommand. java

@Component
public class NijiMemberCommand implements MessageCreateListener {
    @Autowired
    MemberListService memberListService;

    private static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Main.class);

    @Override
    public void onMessageCreate(MessageCreateEvent event){

        String[] command = event.getMessageContent().split(" ");
        if (command.length == 1) {
            logger.info("Will it enter here? no?");
            event.getChannel().sendMessage("You are missing argument, the command is consist of !member ");
            return;
        }
        
        event.getChannel().sendMessage(memberListService.visual(command[1]));
        logger.info("Please enter here..... " + command[1] + " " + memberListService.visual(command[1]));
        event.getChannel().sendMessage(memberListService.visual(command[1]));
        return;

    }
}

Hasta este punto, no hay nada malo hasta que llegó a event.getChannel().sendMessage(memberListService.visual(command[1])); que en mi mente debería llevarme a mi capa de Servicio que es esta

@Service
public class MemberListServiceImpl implements MemberListService {
    @Autowired
    MemberListDB memberListDB;

    private static org.apache.logging.log4j.Logger logger = LogManager.getLogger(Main.class);

    public String capitalize(String name){
        return name.substring(0, 1).toUpperCase() + name.substring(1);
    }
    @Override
    @Transactional
    public String visual(String nama) {
        logger.info("Masuk "+ nama);
        String[] name = nama.split(" ");
        String result =null;
        for(String e : name){
            result+=capitalize(e)+" ";
        }
        return memberListDB.showVisual(result);
    }
}

y este es mi DB

@Repository
@EnableJpaRepositories
public interface MemberListDB extends JpaRepository {
    @Query(value = "select m.visual FROM member_list as m, nickname AS n WHERE n.nick_id = m.nick AND n.nickname=:w", nativeQuery = true)
    String showVisual(@Param("w") String nama);
}

Traté de ejecutar una consulta similar dentro de mi PHPmyadmin, muestra valor no nulo enter image description here

¿Dónde me equivoqué?

// Editar

Este es mi modelo que uso para mi programa

package com.nijicord.nijiworld.db.Model;



import com.nijicord.nijiworld.db.Repository.MemberListDB;
import com.sun.istack.NotNull;

import javax.persistence.*;
import java.io.Serializable;

/**
 * This is the table model that will hold the majority of member's info
 */
@Entity
@Table(name = "member_list")
public class MemberListModel implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "nick")
    private Long nick_id;

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "social_media")
    private Long social_id;


    @NotNull
    @Column(name = "name")
    private String name;

    @NotNull
    @Column(name = "branch")
    private String branch;

    @NotNull
    @Column(name = "debut_3d")
    private boolean debut;


    @Column(name = "illustrator")
    private String illustrator;

    @NotNull
    @Column(name = "visual")
    private String visual;

    public Long getNick_id() {
        return nick_id;
    }

    public void setNick_id(Long nick_id) {
        this.nick_id = nick_id;
    }

    public Long getSocial_id() {
        return social_id;
    }

    public void setSocial_id(Long social_id) {
        this.social_id = social_id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBranch() {
        return branch;
    }

    public void setBranch(String branch) {
        this.branch = branch;
    }

    public boolean isDebut() {
        return debut;
    }

    public void setDebut(boolean debut) {
        this.debut = debut;
    }

    public String getIllustrator() {
        return illustrator;
    }

    public void setIllustrator(String illustrator) {
        this.illustrator = illustrator;
    }

    public String getVisual() {
        return visual;
    }

    public void setVisual(String visual) {
        this.visual = visual;
    }
}

////Este es el error

2020-12-20 15:37:54.405 ERROR 11840 --- [utorService - 1] o.j.core.util.event.EventDispatcherBase  : Unhandled exception in a listener thread for FFJ THREAD EMPORIUM!

java.lang.NullPointerException: null
    at com.nijicord.nijiworld.command.NijiMemberCommand.onMessageCreate(NijiMemberCommand.java:27) ~[main/:na]
    at com.nijicord.nijiworld.command.CommandManager.onMessageCreate(CommandManager.java:44) ~[main/:an]

//////He editado mi publicación original con el flujo y el código.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por compilercaptain


3 Respuestas:

  • Estás usando nama.toUpperCase() Aquí.

        @Override
        @Transactional
        public String visual(String nama) {
            logger.info("Masuk "+ nama);
            return memberListDB.showVisual(nama.toUpperCase());
        }
    

    Pero en la consulta usted está usando el apodo en maletín Por ejemplo. noraneko. Creo que esto podría ser un problema. Estás usando maletín superior en lugar de maletín.

    Respondida el Dec 17, 2020 a las 03:53 - por javajedi

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás obteniendo es una NullPointerException, lo cual significa que estás intentando acceder a un objeto que es null. En este caso, el error se produce en la clase NijiMemberCommand en la línea 27. Vamos a revisar el código:

    java
    event.getChannel().sendMessage(memberListService.visual(command[1]));
    

    El NullPointerException está ocurriendo en esta línea porque el objeto memberListService es null. Esto indica que la inyección de dependencia de MemberListService en la clase NijiMemberCommand no se está realizando correctamente.

    La anotación @Autowired se encarga de realizar la inyección de dependencias en Spring. Para que funcione correctamente, asegúrate de que la clase MemberListService esté correctamente configurada como un componente de Spring y que la inyección se realice sin problemas.

    Comprueba lo siguiente:

    • Asegúrate de que la clase `MemberListService` está correctamente anotada con `@Service`.
    • Asegúrate de que la clase `MemberListService` esté escaneada por Spring para la inyección de dependencias.
    • Verifica que el bean de `MemberListService` esté siendo creado y disponible para la inyección en la clase `NijiMemberCommand`.

    Si después de revisar estos puntos el error persiste, por favor, asegúrate de brindar más detalles sobre la configuración de Spring para poder ayudarte de manera más específica.

    Respondida el Dec 18, 2020 a las 03:57 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema:

    El error java.lang.NullPointerException en la línea 27 de NijiMemberCommand.onMessageCreate() indica que memberListService.visual(command[1]) está devolviendo null.

    Posibles causas:

    • Consulta SQL incorrecta: La consulta SQL en `MemberListDB.showVisual()` podría ser incorrecta o no coincidir con los datos de la base de datos.
    • Falta de implementación: El método `MemberListDB.showVisual()` podría estar mal implementado o no devolver el valor esperado.
    • Datos no válidos: El valor de `command[1]` podría no existir en la base de datos o podría estar mal formado.

    Cómo solucionarlo:

    • Verifica la consulta SQL: Verifica que la consulta SQL en `MemberListDB.showVisual()` sea correcta y coincida con los esquemas de la base de datos.
    • Depura `MemberListDB.showVisual()`: Depura el método `MemberListDB.showVisual()` para asegurarte de que se está implementando correctamente y devolviendo el valor esperado.
    • Verifica los datos: Verifica que el valor de `command[1]` corresponda a un registro válido en la base de datos y que esté formateado correctamente.

    Código de depuración:

    Para depurar el método MemberListDB.showVisual(), puedes usar la función de depuración de tu IDE o agregar declaraciones de registro en el método para rastrear el flujo de ejecución. Por ejemplo:

    java
    @Query(value = "select m.visual FROM member_list as m, nickname AS n WHERE n.nick_id = m.nick AND n.nickname=:w", nativeQuery = true)
    public String showVisual(@Param("w") String nama) {
        logger.info("Consulta SQL ejecutada con el parámetro: " + nama);
        return ...;
    }
    

    Nota:

    Asegúrate de comprobar los registros de tu aplicación para obtener información adicional que pueda ayudarte a diagnosticar el problema.

    Respondida el Dec 18, 2020 a las 03:59 - por Gemini

    Votos positivos: 0 | Votos negativos: 0