Mapowanie JSONA do obiektu tworzonego patternem builder

0

Witam,
Robię aplikacje, a raczej uczę się przy tworzeniu aplikacji. Używam frameworka Spring. Stworzyłem Controller, klasę Person, etc. łączę się do tego service(RESTful service) z innego urządzenia i napotkałem problem.. Mianowicie używam patternu builder do tworzenia instancji klasy Person, a w kontrolerze mam metodę, która przyjmuje @RequestBody obiekt Person, metoda:

@RequestMapping(value = "/create/single", method = RequestMethod.POST)
	public ResponseEntity<Person> create(@ReequestBody Person person) {

		System.out.println(person.toString());
// reszta kodu...
		return new ResponseEntity(person, HttpStatus.CREATED);
	}

I tu występuje problem. Jako, że wysyłam do service dane w postaci JSON, mogę je odebrac jako Stringa

@ReequestBody String person

, ale jako Obiekt już nie.. Sprawdziłem i powodem tego jest właśnie pattern builder zastosowany w klasie Person- skasowałem kod buildera, wstawiłem same pola(imie, wiek, etc.) i settery... Teraz potrafi zmapować JSONObject do Person. Jako, że tworzenie obiektów Person przy pomocy buildera jest wygodne, chciałbym przy nim pozostać. Jest jakiś sposób aby Spring potrafił zmapować JSONA do obiektu poprzez buildera?(wiem że mogę ręcznie to zrobić ze Stringa, ale to odpada- brzydkie rozwiązanie).

serio to przez tego buildera? myślałam, że spring robi to refleksją i potrafi na samych polach operować(nie treba setterów) tak jak jackson. jeny ale to prymitywne - karolinaa

Na to wychodzi. A co na to mistrz Javy i klepania formatek @niezdecydowany ? :) help mi

1

Domyślnie Jackson patrzy na metody get/set można go tak skonfigurować aby właśnie patrzył na pola

 
	@Bean
	public Jackson2ObjectMapperBuilder objectMapperBuilder() {
		return new Jackson2ObjectMapperBuilder() {

			@Override
			public void configure(final ObjectMapper objectMapper) {
				super.configure(objectMapper);
				objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
			}

		};

	}

0

w xmlu teź mogę skonfigurować Jackson2ObjectMapperBuilder i poustawiać propertisy oczywiście? - pewnie głupie pytanie :)

1

Za XML odpowiada pewnie inna biblioteka w to w niej należy skonfigurować odpowiedniego properties'a...pewnie JAXB

0
Szczery napisał(a):

Za XML odpowiada pewnie inna biblioteka w to w niej należy skonfigurować odpowiedniego properties'a...pewnie JAXB

Raczej mi chodziło o sposób konfiguracji beanów springa, ty pokazałeś konfigurowanie springa przez javę, ja robię przez xml

Zrobiłem to w taki sposób, że dodałem z dependency com.fasterxml.jackson.databind, dzięki której mapuje już do obiektu, za pomocą buildera.

@JsonDeserialize(builder=Item.ItemBuilder.class)
public class Item{

//kod klasy item
}
@JsonPOJOBuilder(buildMethodName = "build", withPrefix = "set")
	public static class ItemBuilder{
//kod buildera
}

Z tym, że wszystkie zmienne muszą być ustawiane za pomocą setterów, a chciałbym aby część wartości była ustawiana przez kostruktor buildera- poradzicie jak to zrobić?

Help!

0

To akurat bardzo zły i mylący pomysł. Albo tworzysz obiekty w stylu java beans czyli domyślny konstruktor + settery, albo w stylu buildera czyli domyślny konstruktor + metody with zwracające obiekt, albo inicjalizując wszystko w konstruktorze. Mieszanie tych sposobów jest bardzo nieeleganckie i wprowadza niepotrzebne komplikacje w kodzie.

0
Shalom napisał(a):

To akurat bardzo zły i mylący pomysł. Albo tworzysz obiekty w stylu java beans czyli domyślny konstruktor + settery, albo w stylu buildera czyli domyślny konstruktor + metody with zwracające obiekt, albo inicjalizując wszystko w konstruktorze. Mieszanie tych sposobów jest bardzo nieeleganckie i wprowadza niepotrzebne komplikacje w kodzie.

Pytam, bo w tutorialach build patternu pisują, że te pola, które są obowiązkowe powinny być inicjowane w konstruktorze, a reszta w setterach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1