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
¿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 esnull
. En este caso, el error se produce en la claseNijiMemberCommand
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 objetomemberListService
esnull
. Esto indica que la inyección de dependencia deMemberListService
en la claseNijiMemberCommand
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 claseMemberListService
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 deNijiMemberCommand.onMessageCreate()
indica quememberListService.visual(command[1])
está devolviendonull
.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